NodeJS服务器超时

时间:2016-10-20 12:19:48

标签: javascript node.js express

我的服务器上安装了Express NodeJS实例。 API"我想"超载了。回复如下。

POST /my/api/result - - ms - -

我在./bin/www

中尝试过关注
server.on('connection', function(socket) {
  console.log("A new connection was made by a client.");
  socket.setTimeout(300 * 1000);
});

/app.js

var timeout = require('connect-timeout');
app.use(timeout(6000000));
app.use(haltOnTimedout);
function haltOnTimedout(req, res, next){
    if (!req.timedout) next();
}

但是这个问题解决了这个问题。

API定义

router.post('/search',function (req,res,next) {
if(typeof req.body.q == '' || typeof req.body.q == 'undefined'){
    return res.format({
        json: function () {
            res.send({
                status: 404,
                message: "Mandatory parameter/header is missing."
            });
        }
    });
}else{
    mySQLConn.pool(function (err, conn) {
        if(err){
            return res.format({
                json: function () {
                    res.send({
                        status: 500,
                        message: "Unable to connect to database. " + err
                    })
                }
            });
        }else{
            var q = req.body.q;
            var returnData = [];
            if(q.length> 0){

                var query = "select * from abc where title like '" + q + "%' limit 10"
                conn.query(query, function (err, result) {
                    if(err){
                        return res.format({
                            json: function () {
                                res.send({
                                    status: 500,
                                    message: "error while fetching data "+ err
                                })
                            }
                        });
                    }else{

                        return res.format({
                            json: function () {
                                res.send({
                                    status: 200,
                                    data: result
                                })
                            }
                        });
                    }
                })
            }else{
                return res.format({
                    json: function () {
                        res.send({
                            status: 200,
                            data: returnData
                        })
                    }
                });
            }
        }
    });
}

});

一旦响应停止,linux服务器上的top会有以下响应。

 PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                         
16042 nod       20   0  157700   2144   1520 R  0.3  0.2   0:00.36 top                             
24692 mysql     20   0 1830988 374416   4800 S  0.3 36.8   5:39.80 mysqld 

nod是运行节点应用程序的用户。

2 个答案:

答案 0 :(得分:0)

您包含的每个中间件都必须调用next()或者它必须通过res.end()结束请求。当你调用res.send()或res.render()之类的东西时,后者经常在框架代码中发生更深层次。

App.post和router.post仍然采用中间件功能,因此如果需要,可以传递next的第三个参数。

请求中最终不会以res.end()结尾的任何路径都会导致超时,从而导致服务器崩溃。

答案 1 :(得分:0)

我通过在发送响应之前释放连接以及发生错误来解决此问题。 conn.release()