MSNodeSQL查询错误结果或对JavaScript变量的误解

MSNodeSQL查询错误结果或对JavaScript变量的误解,javascript,sql-server,json,node.js,Javascript,Sql Server,Json,Node.js,当MSNodeSQL查询失败时,我被回调参数弄糊涂了。我是JavaScript新手,所以这可能是一个简单的JavaScript问题。对数据库的简化查询是: conn.query(storedProc, params, function( err, result ) { if (err) { console.log("err = " + err); console.log("err = " + JSON.stringify(err)); } }); 我重命

当MSNodeSQL查询失败时,我被回调参数弄糊涂了。我是JavaScript新手,所以这可能是一个简单的JavaScript问题。对数据库的简化查询是:

conn.query(storedProc, params, function( err, result ) {
if (err) {
        console.log("err = " + err);
        console.log("err = " + JSON.stringify(err));
    }
});
我重命名了一个存储过程,这样就找不到它,并强制执行一个错误。err参数显示错误的有意义描述,如下所示:

err = Error: [Microsoft][SQL Server Native Client 11.0][SQL Server]Could not find stored procedure 'dbo.me3_MsgQueueIn_AddMessage'.
当我将这个变量发送回客户端并在浏览器中显示时,它显示为一个JSON对象,我现在看到,当我在服务器上显示它时,如上图所示,它是一个JSON对象,我看到了

err = {"sqlstate":"42000","code":2812}
虽然有这样一个特定的错误代码很好,但是有一个有意义的错误描述也很好

有人能解释一下err为什么有两个值,一个字符串和一个JSON对象吗


其次,我如何在客户端的浏览器中看到有意义的描述,因为目前我只看到JSON对象及其两个字段。

您看到的是mysql包使用的自定义错误。Error对象与其他对象不同,它不是一个JSON对象。错误中包含的内容与JSON.stringify中显示的内容不同

以该代码为例:

function CustomError( msg ){
  var err = Error.call( this, msg );
  err.customField = "abc";
  return err;
}

var err = new Error("Bad thing");
console.log("err = " + err);   
console.log("err = " + JSON.stringify(err));

var customErr = new CustomError("Custom Bad thing");
console.log("customErr = " + customErr );
console.log("customErr = " + JSON.stringify(customErr) );
输出如下:

err = Error: Bad thing
err = {}
customErr = Error: Custom Bad thing
customErr = {"customField":"abc"}
如您所见,定制错误只显示为其定义的字段,这是您看到的返回到客户端的JSON对象

错误也有有趣的特性

name是错误的类型。尝试添加err.name=CustomError;到自定义错误定义。它会将输出更改为customErr=CustomError:custombad thing

要在客户端上查看该错误消息吗?请尝试err.message,它是名称后面的所有内容。这是创建错误时使用的字符串


一个有趣的是stack属性,它打印出错误的堆栈跟踪。不要把它发送给你的客户:如果抛出错误而没有捕获到错误,你也会看到它。给予顾客错误;“尝试”提示将停止节点进程。

回答得很好。谢谢你的详细解释,从中我学到了很多。