2017-06-17 12 views
0

最近、nodejs、express、https、およびmysqlを使用して残りのAPIを開発しました。この作業は始まりましたが、2〜3日後に私はサーバーが応答していないという不満を持ち始め、ほとんどの時間を返すように要求しました。Node.jsサーバーが特定のリクエストの後に応答を返さない

基本的には、私のnode.jsアプリが要求に応答しなくなってしまいます。私のコンソールでルートが実行され、クライアント(Androidアプリ)からのHTTPコールがすべてサーバーに到達することさえあります。私のnode.jsアプリケーションサーバーを再起動して、必然的に何かが再び停止するまで、すべてが再び動作を開始します。アプリがクラッシュすることはなく、リクエストに応答しなくなるだけです。

エラーは発生していません。すべてのDB接続エラーを処理してログに記録して、どこから開始するかわかりません。

私のデータベース接続コードはここにある:

// call the packages we need 
var mysql  = require('mysql'); //call mysql for db connection 

// configure the function to connect to the database 
var connection = mysql.createConnection({ 
    connectionLimit : 1000, 
    host  : 'localhost', 
    user  : 'test', 
    password : 'abcdefghi', 
    socketPath : '/var/run/mysqld/mysqld.sock' 
}); 

exports.connection = connection; 

私のデータベースクエリのコードはここにある:

var db = require('../dbconnection'); 
var getPostId = function(id,callback){ 
    var sql = "SELECT post_id FROM posts.post_feeds WHERE id=?"; 
    db.connection.query(sql,[id],callback); 
} 

マイアプリサーバーコード:

const fs = require('fs'); 
const https = require('https'); 
const express = require('express'); 
const app  = express(); 
const bodyParser = require('body-parser'); 
const getData = require('./dbhandler/getData'); 

router.route('/postids/') 
    .post(function(req,res){ 
     var success; 
     try { 
      var categoryId = req.body.categoryId; 
      getData.getPostId(categoryId,function(error, results, fields){ 
        if (!error){ 
         success = 1; 
         datasets = []; 
         db = {} 
         for (var i = 0 ; i < results.length; i++) { 
          db = { 
           "postId" : results[i]['post_id'] 
          } 
          datasets.push(db); 
         } 
         res.json({"success" : success, "datasets" : datasets}); 
        } else{ 
         logger.error("Route = /postfeedsbycategory/, error = "+error); 
         success = 0; 
         res.json({"success" : success}); 
        } 
       }); 
     } catch(error){ 
      logger.error("Route = /postfeedsbycategory/, error = "+error); 
      success = 0; 
      res.json({"success" : success}); 
     } 
    }); 
app.use('/api/v2', router); 

app.listen(port); 

かもしれないものに関してどのような手掛かり私はこの問題をどのように解決することができますか?ここで

は私のスタックです:(ノード-MySQLを使用して)(エクスプレス4.15.2 + PM2 2.4.6を使用して)Ubutnu 14.04とnginxの持つデジタルオーシャンサーバー上の

Node.jsのデータベースのMySQL

+1

あなたはまた、HTTP要求を処理するコードを表示する必要があります:あなたは結果を処理する際に、スタイルのポイントとして は、次の手順を実行します。 –

+0

@JulianGoacher更新された投稿を参照してください – user3528954

+0

1つのデータベース接続を作成しています。つまり、アプリケーション([source](https://github.com/mysqljs/mysql) #execution-queries-in-parallel))。 [接続プーリング](https://github.com/mysqljs/mysql#pooling-connections)を見てください。 – robertklep

答えて

1

それクエリのコードでは

var mysql = require('mysql'); 

// configure the function to connect to the database 
var pool = mysql.createPool({ 
    connectionLimit : 1000, 
    host  : 'localhost', 
    user  : 'test', 
    password : 'abcdefghi', 
    socketPath : '/var/run/mysqld/mysqld.sock' 
}); 

exports.pool = pool; 

:接続プールを使用する方が良いでしょう

var db = require('../dbconnection'); 
var getPostId = function(id,callback) { 
    var sql = "SELECT post_id FROM posts.post_feeds WHERE id=?"; 
    db.pool.query(sql,[id],callback); 
} 
let datasets = results.map(result => { "postId": result['post_id'] }); 
+0

接続を決定する方法接続プールの制限 – user3528954

+0

デフォルトのままにする必要があります。これは10です。 1000はおそらく非常に大きく、同時要求数はどれくらいですか? –

+0

接続を閉じるか解放するか。 – user3528954