我正在使用节点js,express和postgresql作为后端。 这是我用来制作rest API的方法:
exports.schema = function (inputs, res) {
var query = knex('schema')
.orderBy('sch_title', 'asc')
.select();
query.exec(function (err, schemas) {
if(err){
var response = {
message: 'Something went wrong when trying to fetch schemas',
thrownErr: err
};
console.error(response);
res.send(500, response);
}
if(schemas.length === 0){
var message = 'No schemas was found';
console.error(message);
res.send(400, message);
return;
}
res.send(200, schemas);
});
};
它可以工作但是过了一段时间postgres记录错误并且它不再有效:
sorry, too man clients already
我是否需要以某种方式关闭每个请求?在快递文档中找不到任何相关内容。什么可能是错的?
此错误仅发生在生产服务器上。不是在开发机器上。
更新 该应用程序仅在一个“模块”中制动。应用程序的其余部分工作正常。所以只有一些查询会产生错误。
答案 0 :(得分:5)
只需为整个应用打开一个连接即可。 docs shows an example如何做到这一点。
此代码包含在app.js
...
var Knex = require('knex');
Knex.knex = Knex.initialize({
client: 'pg',
connection: {
// your connection config
}
});
当您想要在控制器/中间件中查询时......
var knex = require('knex').knex;
exports.schema = function (req, res) {
var query = knex('schema')
.orderBy('sch_title', 'asc')
.select();
// more code...
};
如果您将Knex.initialize
放在app.use
或app.VERB
内,则会针对每个请求重复调用它,因此您最终会多次连接到PG。
对于大多数情况,您不需要为每个HTTP请求执行open + query + close。