2017-06-17 137 views
0

最近我開發了一個使用nodejs,express,https和mysql的rest API。這在開始時工作良好,但在兩到三天後,我開始抱怨服務器沒有響應,並且大多數時間要求返回超時。Node.js服務器在某些請求後沒有返回響應

基本上在一定數量的任務後,我的node.js應用程序停止響應請求。我甚至看到路由在我的控制檯上被觸發,並且來自我的客戶端(Android應用程序)的HTTP調用到達服務器所有這些。但是重新啓動我的node.js應用服務器,所有事情都會重新開始,直到事情不可避免地再次停止。該應用程序從不崩潰,它只是停止響應請求。

我沒有收到任何錯誤,並且我確保處理並記錄所有數據庫連接錯誤,所以我不確定從哪裏開始。

我的數據庫連接的代碼是在這裏:

// 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); 

任何線索,什麼可能正在發生以及我如何解決這個問題?

這裏是我的籌碼:

與Ubutnu 14.04和Nginx的數字海洋服務器上的Node.js(使用快遞4.15.2 + PM2 2.4.6)數據庫(使用節點的MySQL)

+1

您應該顯示的代碼處理HTTP請求也。 –

+0

@JulianGoacher請參閱已更新的文章 – user3528954

+0

您正在創建單個數據庫連接,這意味着您只能在應用程序的任何時候執行一個查詢([source](https://github.com/mysqljs/mysql) #執行查詢 - 在平行))。你可能想看看[連接池](https://github.com/mysqljs/mysql#pooling-connections)。 – robertklep

回答

1

它運行MySQL會更好地使用連接池:

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

我們如何決定連接池中的connectionLimit – user3528954

+0

您應該將其保留爲默認值10,並瞭解它如何適用於您。 1000可能非常大 - 你期望有多少併發請求? –

+0

何時關閉或釋放連接。 – user3528954

相關問題