node.js - Node 到 mssql 的多个并发连接

标签 node.js express

我正在将 Node 与express和mssql一起使用,并且查询数据库工作正常。但是,如果我同时传递 2 个并发请求,我会得到:

UnhandledPromiseRejectionWarning:连接错误:数据库已连接!在连接到不同的数据库之前调用 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();
        })
    })
    })

编辑:

这是我最终得到的结果:

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);
})
})

最佳答案

您不应该在每个请求上使用 conn.connect(),这会初始化连接池,并且应该在您的服务启动时使用。

因此,您希望 conn.connect()var conn = pool 之后立即发生。这将指示连接池打开与数据库的连接,然后您的应用程序可以在各个端点中按需使用该连接。您可以在mssql library documentation中看到这样的示例。 。该代码使用 sql.connect() 打开连接,然后继续使用 sql 对象创建和执行 SQL 查询。在您的示例中,您将使用 conn 而不是 sql。我自己没有使用过该库,但这就是文档所建议的。

您也不应该在调用数据库后关闭连接,因为您可能没有想到这会关闭整个连接池。这个想法是打开一个连接池,并在服务运行期间保留它们,但您应该在关闭阶段明确运行 conn.close()

关于node.js - Node 到 mssql 的多个并发连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53818134/

相关文章:

node.js - fs.mkdir 和 fs.rename 的 NodeJs 方法链接

image - 使用 express.js 和 node 上传文件,限制扩展名

javascript - 快速路线 404

node.js - 坚持进行简单的网络聊天

node.js - 启动nodejs 关于语言结构的任何概述

javascript - agent.add 在 Promise.then 对话框流中不起作用

node.js - 在nodejs中 Sequelize findAll排序顺序

javascript - Nodejs - Express - 在 API 中处理可选查询字符串参数的最佳实践

javascript - Ajax和Mongodb,使用_id

node.js - 如何更改 Node 模块 "say"的音频输出设备