Node.js服务器在某些请求后没有返回响应

时间:2017-06-17 10:50:02

标签: mysql node.js rest nginx node-mysql

最近我使用nodejs,express,https和mysql开发了一个rest api到生产中。这开始工作良好,但在两到三天后我开始抱怨服务器没有响应并且请求大部分时间返回时间。

基本上在经过一定数量的任务后,我的node.js应用程序停止响应请求。我甚至看到在我的控制台上触发的路由以及来自我的客户端(Android应用程序)的HTTP调用都到达服务器所有这些。但重新启动后我的node.js app服务器一切都重新开始工作,直到事情不可避免地再次停止。该应用程序永远不会崩溃,它只是停止响应请求。

我没有收到任何错误,我确保处理并记录所有数据库连接错误,所以我不知道从哪里开始。

我的数据库连接代码在这里:

// 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的Digital Ocean服务器上的Node.js(使用Express 4.15.2 + PM2 2.4.6)运行MySQL的数据库(使用node-mysql)

1 个答案:

答案 0 :(得分:3)

最好使用连接池:

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'] });