【问题标题】:Can't get Node mssql to work properly无法让 Node mssql 正常工作
【发布时间】:2017-04-25 20:45:57
【问题描述】:

这是我目前使用 mssql 的方式,但有时会出错:

JavaScript:

router.get('/academiejaren', (req, res) => {
    sql.connect(dbconfig, function (err) {
        var request = new sql.Request();
        if (err) {
            console.log(err);
            return;
        }
        request.query("SELECT * FROM [Alg].[DefAJ];", function (err, recordset) {
            if (err) {
                console.log(err);
                return;
            }
            else {
                res.end(JSON.stringify(recordset));
            }
        });
        request.query();
    });
});

错误:

{ ConnectionError: Connection is closed.
    at C:\Users\Milan\Documents\Octopus\Octopus 2.0\node_modules\mssql\lib\main.js:1569:17
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)
  name: 'ConnectionError',
  message: 'Connection is closed.',
  code: 'ECONNCLOSED' }
(node:556) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ConnectionError: Connection is closed.
(node:556) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我正在使用 3.2.0 版本,因为我无法让最新版本 4.0.2 工作...任何帮助或一些好的示例,因为我无法弄清楚文档...

提前致谢!

编辑

将一个小型测试项目更新到 4.0.2。我让它工作了。打算将我的 API 更改为此更新。

router.get('/academiejaren', (req, res) => {
    (async function () {
        try {
            let pool = await sql.connect(config)
            let result1 = await pool.request()
                .query('SELECT * FROM [Alg].[DefAJ];')

            res.send(JSON.stringify(result1.recordset));


        } catch (err) {
            res.send("CAUGHT ERROR academiejaren");
        }
    })()

    sql.on('error', err => {
        // ... error handler
    })
});

现在我确实还有一个小问题,我应该如何处理 catch 和 sql.on()?我应该如何处理错误?

【问题讨论】:

    标签: javascript node.js node-mssql


    【解决方案1】:
    router.get('/academiejaren', (req, res) => {
        sql.connect(dbconfig, function (err) {
            var request = new sql.Request();
            if (err) {
                console.log(err);
                return;
            }
            request.query("SELECT * FROM [Alg].[DefAJ];", function (err, recordset) {
                if (err) {
                    console.log(err);
                    return;
                }
                else {
                    res.send(JSON.stringify(recordset));
                }
            });
            request.query();
        });
    });
    

    你确实做了res.endend 退出它,你想要res.send

    【讨论】:

    • 天啊...但有时它确实有效?我从 api 取回了我的数据?它只是有时会返回此错误?
    • 你打开了连接。这部分没有问题,如果您想了解更多关于 res.end 的信息,请看这里:stackoverflow.com/a/40326333/7707749
    • 哦,好的,谢谢!!我有一个问题可以吗?每次数据操作/下载后我都必须执行 sql.close() 吗?
    • 不需要关闭 sql,我认为 res.send 会为您退出它?你必须查一下,但 sql 不需要 close
    • 和绿色问题;P
    【解决方案2】:

    我做的有点不同:

    router.get('/', function(req, res, next) {
    
        sql.connect(dbconfig).then(function() {
                // Query 
                new sql.Request().query("Your query")
                  .then(function(recordset) {
                    //console.dir(recordset);
                    res.setHeader('Content-Type', 'application/json');
                    res.send( recordset );
                  }).catch(function(err) {
                    // ... query error checks 
                });
           });
      });
    

    现在在你的 dbconfig 中确保你得到它: mssql://user:password@server/db

    【讨论】:

    • 是的,我发现了很多不同的方法。请参阅我要进行的编辑,现在我正在使用异步函数。这就是我在 de 文档中找到的。
    猜你喜欢
    • 2012-09-05
    • 2017-11-06
    • 2011-09-06
    • 1970-01-01
    • 2023-03-10
    • 2020-10-16
    • 2014-01-15
    • 2019-07-29
    • 1970-01-01
    相关资源
    最近更新 更多