最近我使用 nodejs、express、https 和 mysql 开发了一个 rest api 用于生产。这在开始时工作良好但两到三天后我开始提示服务器没有响应并且请求返回大部分时间超时。
基本上,在一定数量的请求之后,我的 node.js 应用程序停止响应请求。我什至看到路由在我的控制台上被触发,来 self 的客户端(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(使用 Express 4.15.2 + PM2 2.4.6)的 Digital Ocean 服务器上的 Node.js 运行 MySQL 的数据库(使用 node-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'] });
关于mysql - Node.js 服务器在某些请求后不返回响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44603701/