2016-12-20 22 views
17

Tôi đang sử dụng máy chủ nút để xử lý tất cả các dịch vụ thông báo đẩy của tôi như gcm và apn.Nodejs Socket treo & ECONNRESET - Yêu cầu đăng bài HTTP từ máy chủ Meteor tới Node js

Tôi có 2 máy chủ khác nhau. Một cái đang chạy Meteor và cái khác đang chạy Node.JS để xử lý các thông báo đẩy. (Cả hai máy chủ khác nhau)

Ứng dụng chính của tôi chạy trên máy chủ Meteor.

Tôi thực hiện yêu cầu đăng HTTP tới máy chủ node.js để gửi thông báo của tôi.

Thông thường nó hoạt động tốt, nhưng đôi khi trên máy chủ Meteor tôi nhận được lỗi này bất cứ khi nào tôi gọi là máy chủ Node.js:

socket hang up\n at Object.Future.wait (/home/myPc/.meteor/packages/meteor-tool/.1.1.10.ki0ccv++os.linux.x86_64+web.browser+web.cordova/mt-os.linux.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:398:15)\n at Object.<anonymous> (packages/meteor/helpers.js:119:1)\n at Object.HTTP.call (packages/meteorhacks_kadira/lib/hijack/http.js:10:1)\n at Object.sendPushNotificationsMeteorServer (server/pushNotifications.js:249:1)\n at server/classes/pushNotifications.js:244:1\n at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1)\n at packages/meteor/timers.js:6:1\n at runWithEnvironment (packages/meteor/dynamics_nodejs.js:110:1)\n - - - - -\n at createHangUpError (http.js:1473:15)\n at Socket.socketOnEnd [as onend] (http.js:1569:23)\n at Socket.g (events.js:180:16)\n at Socket.emit (events.js:117:20)\n at _stream_readable.js:944:16\n at process._tickCallback (node.js:448:13)', 
details: { [Error: socket hang up] stack: [Getter] }, 
data: { [Error: socket hang up] stack: [Getter] }, 
user: null, 
userId: null, 
toString: [Function] }, 
user: null, 
userId: null, 
toString: [Function] } 

HOẶC

 
Error: read ECONNRESET 
    at Object.Future.wait (/home/mbm/.meteor/packages/meteor-tool/.1.1.10.12ml1tp++os.linux.x86_64+web.browser+web.cordova/mt-os.linux.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:398:15) 
    at Object.call (packages/meteor/helpers.js:119:1) 
    at Object.sendHttpCall (server/pushNotifications.js:249:1) 
    at server/pushNotifications.js:244:1 
    at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) 
    at packages/meteor/timers.js:6:1 
    at runWithEnvironment (packages/meteor/dynamics_nodejs.js:110:1) 
    - - - - - 
    at errnoException (net.js:905:11) 
    at TCP.onread (net.js:559:19) 

Đây là Node tôi. Mã máy chủ JS:

realFs    = require('fs'); 
var gracefulFs  = require('graceful-fs'); 
gracefulFs.gracefulify(realFs); 

var http    = require('http'); 
var express   = require('express'); 
var app    = express(); 

var path    = require("path"); 

configClass   = require('./classes/config.js').configClass; 
helperClass   = require('./classes/helper.js').helperClass; 
pushNotificationClass = require('./classes/pushNotification.js').pushNotificationClass; 

var hostname   = 'http://localhost'; 
var port    = 6000; 

var bodyParser  = require('body-parser'); 

nodeGcm    = require('node-gcm'); 
apn     = require('apn'); 
apnService   = new apn.Connection(helperClass.getAPNOptions()); 

// -- BODY PARSER -- // 
app.use(bodyParser.json({limit: '50mb'})); 
app.use(bodyParser.urlencoded({limit: '50mb', extended: true})); 

process.on('uncaughtException', function (err) { 

    console.error(err); 
    console.log("Node NOT Exiting..."); 
}); 

// All post requests 
app.post('/', function(req, res){ 

    try { 

    var response = JSON.parse(req.body.pushNotificationApiParams); 
    var callType = req.body.callType; 

    switch (callType) { 
     case 'systemPushNotifications': 
      return pushNotificationClass.sendPushNotificationsV2(response); 
     break; 
    } 
    } 
    catch(e){ 

    console.dir(e.stack); 
    realFs.appendFile('errorLogs/'+helperClass.getCurrentDateFormated()+'.log', helperClass.formatLog('Exception in main Post Method : '+e.stack) , function (err) { 
     if (err) throw err; 
    }); 
    } 

    res.send("OK"); 
}); 



app.listen(port, function() { 
    console.log('Listening at '+hostname+':'+port); 
}); 

Và đây là mã của tôi từ Bên thiên thạch, nơi tôi thực hiện yêu cầu đăng bài HTTP lên máy chủ nút js:

var headers = { 
    'Content-Type' : 'application/x-www-form-urlencoded' 
}; 

var postFields = { 
    callType : 'systemPushNotifications', 
    pushNotificationApiParams : JSON.stringify(pushNotificationApiParams) // contains push notifications data     
}; 

HTTP.call("POST", 'http://localhost:6000', { params:postFields, headers:headers }); 

Có ai hướng dẫn tôi đi đúng hướng không? Ngoài ra tôi thực sự sẽ đánh giá cao để biết một số thực hành tốt là tốt.

Cũng

Có thêm một vấn đề tôi đang phải đối mặt. Máy chủ node.js của tôi thoát sau 24 giờ. Tôi không biết tại sao điều đó lại xảy ra. Nó thoát mà không có bất kỳ lỗi hoặc ngoại lệ nào trong bảng điều khiển đầu cuối. Tôi phải khởi động lại nó mỗi lần.

+0

Cả hai máy chủ trên cùng một máy? – jannis

+0

@jannis Không, chúng là các máy chủ khác nhau – StormTrooper

+0

Bạn nên cân nhắc vấn đề về mạng sau đó (điều gì đó ở giữa - ví dụ: cổng/proxy bị quá tải - đặt lại kết nối). Tôi đã thiết lập giám sát tcp ở cả hai bên và cố gắng tái tạo vấn đề. Sau đó, khi nó xảy ra tôi muốn kiểm tra các bản ghi để xem nếu nó thực sự là bên máy chủ nodejs đó là phá vỡ kết nối. Điều này sẽ cho bạn biết nơi để tìm thêm - mạng hoặc chính máy chủ. Tôi đặt cược vào mạng vì điều này là khá ngẫu nhiên như bạn nói. – jannis

Trả lời

0

Ok tôi đã tự tìm thấy vấn đề ở đây. Của nó trong mã máy chủ nút.Tôi đưa trở lại trong một câu lệnh switch mà không phải là một cách hợp lệ để trả lại một phản ứng trong nhanh, vì vậy tôi chỉ cần loại bỏ các trở về từ:

Trước:

switch (callType) { 
    case 'systemPushNotifications': 
     return pushNotificationClass.sendPushNotificationsV2(response); 
    break; 
} 

Bây giờ là:

switch (callType) { 
    case 'systemPushNotifications': 
     pushNotificationClass.sendPushNotificationsV2(response); 
    break; 
} 

Ở trên return đã chấm dứt mã trước: res.send("OK");

5

Xét ECONNRESET lỗi thường xảy ra khi * phía bên kia của TCP connection bị đóng đột ngột.

  • Trong trường hợp của ứng dụng của bạn nó có thể là do sự overloading của máy chủ và chỉ cần giết chết các kết nối như một sự trở lại đó trong các khối cách tương tự kết nối đến bạn meteor server

Để nhận thêm thông tin về lỗi như được đề cập trong phần thread này. Để xử lý các lỗi mà bạn phải sử dụng một event listener với nó để hiển thị toàn bộ stack traces của nó

Như đã đề cập trong chủ đề này bằng cách Farid Nouri Neshat

Để có một người biết lắng nghe cho một nhóm các cuộc gọi mà bạn có thể sử dụng tên miền và cũng bắt các lỗi khác khi chạy. Đảm bảo mỗi thao tác không đồng bộ liên quan đến http (Máy chủ/Khách hàng) nằm trong ngữ cảnh khác nhau của domain so với các phần khác của mã, tên miền sẽ tự động lắng nghe các sự kiện lỗi và sẽ truyền nó tới trình xử lý riêng của nó. Vì vậy, bạn chỉ nghe trình xử lý đó và nhận dữ liệu lỗi.

nhưng kể từ khi tên miền đã bị phản đối, bạn nên sử dụng các cụm như đã đề cập ở đây docs trong đó sử dụng server.listen(message)server.listen(handle)

hoặc bạn cũng có thể sử dụng NODE_DEBUG=net hoặc sử dụng strace

Cập nhật

Để ngắt kết nối máy chủ tôi nghĩ lỗi có thể là trong xử lý của bạn của bodyparser .Đối với một tập tin xấujson lỗi là còn tự do.

Hành động mặc định của nút sau một ngoại lệ chưa được thực hiện là thoát (tai nạn) trong quá trình.

Xử lý bodyparser cho tệp json có thể được thực hiện theo cách sau.

var parseJson = bodyPaser.json(); 

app.use(function (req, res, next) { 
    req.getBody = function (callback) { 
     parseJson(req, res,function (err) { 
      callback(err, req.body); 
     }); 
    }; 
    next(); 
}); 

tham khảo lấy từ here

Update mở vấn đề của GitHub 2

Về cơ bản các socket hangup có nghĩa là ổ cắm không ngắt kết nối trong khoảng thời gian quy định

Theo số source bạn có thể thấy rằng nó xảy ra nếu máy chủ không bao giờ gửi những phản ứng

.Đây lỗi nên bị bắt và bị xử lý bằng một trong hai

  • thử lại để yêu cầu.
  • xử lý sau bằng cách cài đặt thêm time period hoặc đặt res.end() ở cuối kết thúc chức năng để kết thúc kết nối.
  • hoặc bạn có thể sử dụng [http.get()][8] với get yêu cầu đó sẽ tự động gọi req.end() chức năng

Hy vọng nó có thể giúp bạn một chút! Chúc mừng!

+0

Ngoài ra còn có một vấn đề khác mà tôi đang gặp phải. Máy chủ nodejs của tôi thoát sau 24 giờ. Tôi không biết tại sao điều đó xảy ra .. Nó thoát mà không có bất kỳ lỗi hoặc ngoại lệ trong giao diện điều khiển thiết bị đầu cuối. – StormTrooper

+0

vui lòng chỉ định nền tảng nào bạn đang sử dụng và bất kỳ thứ gì khác có thể cần thiết, tôi sẽ cố gắng xem xét nó –

+0

Cả hai máy chủ đều được lưu trữ trên hệ điều hành Linux. Máy chủ NodeJs chỉ xử lý các thông báo đẩy. Mã gây nhầm lẫn cho tôi là res.end ('thanks'); phần. Tôi cho rằng câu trả lời của tôi không được trả về đôi khi, vì đây hoàn toàn là một hoạt động không đồng bộ, do đó đôi khi nó có thể không trả lại sự thừa nhận, hoặc đôi khi sự thừa nhận bị trì hoãn. thats những gì tôi cảm thấy – StormTrooper

Các vấn đề liên quan