web-dev-qa-db-ja.com

NodejsソケットのハングアップとECONNRESET-MeteorからのHTTPポストリクエストNode js server

ノードサーバーを使用して、gcmやapnなどのすべてのプッシュ通知サービスを処理しています。

2つの異なるサーバーがあります。 1つはMeteorを実行しており、もう1つは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] }

[〜#〜]または[〜#〜]

エラー:Object.Future.wait(/home/mbm/.meteor/packages/meteor-tool/.1.1.10.12ml1tp++os.linux.x86_64+webでECONNRESET 
を読み取ります。 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)
 packages/meteor/timers.js:6:1 
 at runWithEnvironment(packages/meteor/dynamics_nodejs.js :110:1)
-----
 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);
});

そして、これが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 });

誰でも私を正しい方向に導くことができますか?また、いくつかの優れた実践方法も知っていただければ幸いです。

また

私が直面しているもう1つの問題があります。 node.jsサーバーは24時間ほどで終了します。なぜそれが起こるのか分かりません。端末コンソールでエラーまたは例外なしで終了します。毎回再起動する必要があります。

20
StormTrooper

ここで問題を自分で見つけました。そのノードサーバーコード。 returnをswitchステートメントに入れますが、これはexpressで応答を返すための有効な方法ではないため、次のようにreturnを削除しました。

前:

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

現在:

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

上記のreturnは、次の前にコードを終了していました:res.send("OK");

0
StormTrooper