【发布时间】:2017-05-05 15:31:32
【问题描述】:
我正在使用节点服务器来处理我的所有推送通知服务,例如 gcm 和 apn。
我有 2 台不同的服务器。一个运行 Meteor,另一个运行 Node.JS 来处理推送通知。 (两者都是不同的服务器)
我的主应用在 Meteor 服务器上运行。
我向 node.js 服务器发出 HTTP 发布请求以发送我的通知。
通常它工作正常,但有时在 Meteor 服务器上,每当我调用 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] }
或
错误:读取 ECONNRESET 在 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) 在 Object.call (packages/meteor/helpers.js:119:1) 在 Object.sendHttpCall (server/pushNotifications.js:249:1) 在服务器/pushNotifications.js:244:1 在 [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) 在包/流星/timers.js:6:1 在 runWithEnvironment (packages/meteor/dynamics_nodejs.js:110:1) - - - - - 在 errnoException (net.js:905:11) 在 TCP.onread (net.js:559:19)这是我的 Node.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);
});
这是我来自 Meteor 端的代码,我在其中向节点 js 服务器发出 HTTP 发布请求:
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 });
谁能指引我正确的方向?此外,我也非常希望了解一些好的做法。
还有
我还面临一个问题。我的 node.js 服务器在 24 小时后退出。我不知道为什么会这样。它在终端控制台中退出,没有任何错误或异常。我每次都必须重新启动它。
【问题讨论】:
-
两台服务器是否在同一台机器上?
-
@jannis 不,它们是不同的服务器
-
您应该考虑网络问题(介于两者之间的问题 - 例如网关/代理过载 - 重置连接)。我会在双方都设置 tcp 监控并尝试重现该问题。然后,当它发生时,我会检查日志以查看是否真的是 nodejs 服务器方破坏了连接。这将告诉您进一步查看的位置 - 网络或服务器本身。我会在网络上打赌,因为正如你所说,这是非常随机的。
标签: javascript node.js http express meteor