我正在使用带有 express 和 mssql 的节点,并且查询数据库工作正常。但是,如果我同时传递 2 个并发请求,我会得到:
UnhandledPromiseRejectionWarning: ConnectionError: 数据库已连接!在连接到不同的数据库之前调用 close。
var express = require('express'); // Web Framework
var app = express();
var sql = require('mssql/msnodesqlv8');
const pool = new sql.ConnectionPool({
database: 'db123',
server: 'server1',
driver: 'msnodesqlv8',
options: {
trustedConnection: true
},
})
var conn = pool;
var server = app.listen(5001, function () {
var host = server.address().address
var port = server.address().port
console.log("app listening at http://%s:%s", host, port)
});
// GET: SQL Stored procedure return time codes
app.get('/codes/:userid/:showclosed', function (req, res) {
conn.connect().then(function () {
var request = new sql.Request(conn);
request.input('userid', req.params.userid);
request.input('showclosed', parseInt(req.params.showclosed));
request.execute('sel_new', function(err, recordsets, returnValue, affected) {
if(err) console.log(err);
res.end(JSON.stringify(recordsets)); // Result in JSON format
conn.close();
})
})
})
Run Code Online (Sandbox Code Playgroud)
编辑:
这是我最终的结果:
app.get('/codes/:userid/:showclosed', function (req, res) {
//const pool1 = new sql.ConnectionPool(config);
(async function () {
try {
let pool = await conn;
// Stored procedure
let result2 = await pool.request()
.input('userid', req.params.userid)
.input('showclosed', parseInt(req.params.showclosed))
.execute('StoredProcedure1', function(err, recordsets, returnValue, affected) {
if(err) console.log(err);
res.end(JSON.stringify(recordsets)); // Result in JSON format
//sql.close();
})
} catch (err) {
console.log(err);
}
})()
sql.on('error', err => {
console.log(err);
})
})
Run Code Online (Sandbox Code Playgroud)
您不应该conn.connect()在每个请求上都使用它,这会初始化连接池,并且应该在您的服务启动时使用。
所以你想conn.connect()在var conn = pool. 这将指示连接池打开与数据库的连接,然后您的应用程序可以在您的各种端点中按需使用该连接。您可以在mssql 库文档中看到一个示例。该代码打开一个连接,sql.connect()然后继续使用该sql对象来创建和执行 SQL 查询。在您的示例中,您将使用conn而不是sql. 我自己没有使用过这个库,但这就是文档所暗示的。
您也不应该在调用数据库后关闭连接,因为您可能没有想到这会关闭整个连接池。这个想法是打开一个连接池并在服务运行时让它们一直存在,但你应该conn.close()在关闭阶段运行。
| 归档时间: |
|
| 查看次数: |
3023 次 |
| 最近记录: |