代码之家  ›  专栏  ›  技术社区  ›  John

Expressjs没有从msnodesqlv8 err对象返回所有属性

  •  0
  • John  · 技术社区  · 7 年前

    在下面的代码中,我试图连接到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
        }
    ]
    

    如何让express也返回消息和堆栈属性?

    1 回复  |  直到 7 年前
        1
  •  0
  •   daramasala    7 年前

    问题是 Error 没有可枚举字段,因此 message 和 stack 不要序列化为JSON。

    看见 this question 获取序列化错误对象的方法。

    针对您的案例的快速解决方案: res.status(500).send({message: err.message, stack: err.stack});

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

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

    并使用@jonathan 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;
    }
    
    推荐文章