我的服务器上安装了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
是运行节点应用程序的用户。
答案 0 :(得分:0)
您包含的每个中间件都必须调用next()或者它必须通过res.end()结束请求。当你调用res.send()或res.render()之类的东西时,后者经常在框架代码中发生更深层次。
App.post和router.post仍然采用中间件功能,因此如果需要,可以传递next的第三个参数。
请求中最终不会以res.end()结尾的任何路径都会导致超时,从而导致服务器崩溃。
答案 1 :(得分:0)
我通过在发送响应之前释放连接以及发生错误来解决此问题。 conn.release()