Sto*_*per 20 javascript http node.js express meteor
我正在使用节点服务器来处理我的所有推送通知服务,如gcm和apn.
我有2个不同的服务器.一个运行Meteor,另一个运行Node.JS来处理推送通知.(两者都是不同的服务器)
我的主应用程序在Meteor服务器上运行.
我向node.js服务器发出HTTP post请求以发送我的通知.
通常它工作正常,但有时在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] }
Run Code Online (Sandbox Code Playgroud)
要么
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)
这是我的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);
});
Run Code Online (Sandbox Code Playgroud)
这是我的Meteor代码,我向节点js服务器发出HTTP post请求:
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 });
Run Code Online (Sandbox Code Playgroud)
谁能引导我朝着正确的方向前进?我也非常感谢你也了解一些好的做法.
也
我还面临一个问题.我的node.js服务器在24小时后退出.我不知道为什么会这样.它在终端控制台中没有任何错误或异常退出.我每次都要重启它.
考虑到ECONNRESET错误通常发生在*的另一侧TCP connection突然关闭时.
overloading服务器的,并简单地杀死连接作为返回,以类似的方式阻止连接到您的meteor server要获得有关此线程中提到的错误的更多信息.要处理错误,您必须使用event listener它来显示它的全部stack traces内容
正如Farid Nouri Neshat在这篇帖子中提到的那样
要为一组调用创建一个侦听器,您可以使用域并在运行时捕获其他错误.确保与http(服务器/客户端)相关的每个异步操作与代码的其他部分相比处于不同的域上下文中,域将自动侦听错误事件并将其传播到它自己的处理程序.所以你只听那个处理程序并获取错误数据.
但由于域名已经被弃用,你应该使用集群作为在这里所提到的文档,其使用server.listen(message)和server.listen(handle)
或者您也可以使用NODE_DEBUG=net或使用strace
更新
对于服务器断开连接,我认为错误可能在您处理bodyparser.对于错误的 json文件,错误未被捕获.
在未捕获的异常之后,节点的默认操作是退出(崩溃)进程.
可以通过以下方式处理json文件的bodyparser.
var parseJson = bodyPaser.json();
app.use(function (req, res, next) {
req.getBody = function (callback) {
parseJson(req, res,function (err) {
callback(err, req.body);
});
};
next();
});
Run Code Online (Sandbox Code Playgroud)
参考GITHUB开放问题在这里
更新2
基本上,这socket hangup意味着套接字不会在指定的时间段内结束连接
根据源代码,您可以看到,如果服务器从未发送响应,则会发生这种情况
这个错误应该被捕获和处理
time period或将res.end()在你的函数结束结束连接.[http.get()][8]的get请求req.end()希望它可能对你有所帮助!干杯!
| 归档时间: |
|
| 查看次数: |
18183 次 |
| 最近记录: |