2017-06-17 499 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

相关问题