最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Expressjs不返回所有属性从msnodesqlv8 Err对象

运维笔记admin10浏览0评论

Expressjs不返回所有属性从msnodesqlv8 Err对象

Expressjs不返回所有属性从msnodesqlv8 Err对象

在下面的代码中,我通过尝试连接到不SQL Server上存在的数据库引起错误(图)。

const sql = require("msnodesqlv8");
const express = require("express");
const app = express();

// Start server and listen on http://localhost:8081/
const server = app.listen(8081, function () {
    console.log("Server listening on port: %s", server.address().port)
});

const connectionString = "Server=.;Database=DatabaseThatDoesNotExist;Trusted_Connection=Yes;Driver={SQL Server Native Client 11.0}";
const sql = "SELECT * FROM dbo.Table1";

app.get('/', function (req, res)
{
    sql.query(connectionString, sql, (err, recordset) => {
        if(err)
        {
            console.log(err);
            res.status(500).send(err);
            return;
        }

        // else
        res.json(recordset);
    });
})

console.log(err);的结果列出了与四个属性(代码,消息,SQLSTATE和堆栈)的错误的对象:

Array(2) [Error: [Microsoft][SQL Server Native Client 11.0][…, Error: [Microsoft][SQL Server Native Client 11.0][…]
codefile.js:33
length:2
__proto__:Array(0) [, …]
0:Error: [Microsoft][SQL Server Native Client 11.0][SQL Server]Login failed for user 'DOMAIN\USER'.
code:18456
message:"[Microsoft][SQL Server Native Client 11.0][SQL Server]Login failed for user 'DOMAIN\USER'."
sqlstate:"28000"
stack:"Error: [Microsoft][SQL Server Native Client 11.0][SQL Server]Login failed for user 'DOMAIN\USER'."
__proto__:Object {constructor: , name: "Error", message: "", …}
1:Error: [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot open database "MyDatabase" requested by the login. The login failed.
code:4060
message:"[Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot open database "MyDatabase" requested by the login. The login failed."
sqlstate:"42000"
stack:"Error: [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot open database "MyDatabase" requested by the login. The login failed."
__proto__:Object {constructor: , name: "Error", message: "", …}

然而,res.status(500).send(err);(在客户端看到的)的结果只包含两个属性(SQLSTATE和代码):

[
    {
        "sqlstate": "28000",
        "code": 18456
    },
    {
        "sqlstate": "42000",
        "code": 4060
    }
]

我该如何表达也返回消息和堆栈属性?

回答如下:

问题是,Error没有枚举的领域,因此messagestack没有得到序列化到JSON。

见this question办法序列化的错误对象。

对于你的情况迅速解决:res.status(500).send({message: err.message, stack: err.stack});

但是,这当然是不可扩展的。更好的办法是配置json replacer for express:

app.set('json replacer', replaceErrors);

并通过@乔纳森 - lonowski使用来自链接的问题优异的答案替代品实现:

function replaceErrors(key, value) {
  if (value instanceof Error) {
    var error = {};

    Object.getOwnPropertyNames(value).forEach(function (key) {
        error[key] = value[key];
    });

    return error;
  }
  return value;
}
发布评论

评论列表(0)

  1. 暂无评论