如何从仅出现在console.log()中而不出现在JSON.stringify()中的JavaScript对象中获取属性?

时间:2019-02-06 10:06:57

标签: javascript node.js json console.log

我从SQLite数据库中得到了一个错误对象。当我用console.log(err)显示它时,我得到:

  

{记录:{错误:SQLITE_ERROR:否这样的表:ShowerUsers errno:   1,代码:“ SQLITE_ERROR”}}

但是当我用JSON.stringify(err)显示它时,我只会得到:

  

{“ records”:{“ errno”:1,“ code”:“ SQLITE_ERROR”}}

我想以字符串形式获取错误消息no such table: showcaseUsers

我发现执行此操作的唯一方法是:

const errorText = console.log(data);

但这还会将数据输出到控制台,这是不希望的。

我如何(1)阻止console.log将其内容输出到控制台,或者(2)以其他方式获得错误消息?

注意:目前,我位于Node而不是浏览器中,因此Capturing javascript console.log?的答案似乎没有帮助。

2 个答案:

答案 0 :(得分:1)

根本不需要拦截console-尽管您仍会以err.message为前缀,但您会在SQLITE_ERROR:中找到整个错误消息

这是Error对象的不可枚举的属性,因此为什么它不出现在JSON输出中:

let sqlite3 = require('sqlite3');

let db = new sqlite3.Database(':memory:');
db.run("UPDATE foo SET bar = 1", (err, res) => {
  console.log(Object.getOwnPropertyDescriptors(err));
  console.log(err.message);
});

输出:

{ stack:
   { value: 'Error: SQLITE_ERROR: no such table: foo',
     writable: true,
     enumerable: false,
     configurable: true },
  message:
   { value: 'SQLITE_ERROR: no such table: foo',
     writable: true,
     enumerable: false,        <<---------
     configurable: true },
  errno:
   { value: 1, writable: true, enumerable: true, configurable: true },
  code:
   { value: 'SQLITE_ERROR',
     writable: true,
     enumerable: true,
     configurable: true } }
SQLITE_ERROR: no such table: foo

答案 1 :(得分:-2)

问题的格式错误,必须为key:value对。如果value中的key:value是字符串,则应将其用单引号或双引号引起来。

  

{记录:{错误:SQLITE_ERROR:没有这样的表:showantUsers errno:1,代码:'SQLITE_ERROR'}}

在缺少适当的value(您的情况下value的数据类型为String)的情况下,JSON.stringify(err)试图基于冒号:将其强制转换为JSON作为keyvalue之间的分隔符。 Available datatypes in JavaScript

这是一个更正,我将其括在双引号中并对其进行了格式化(格式化是可选的,有助于提高可读性)。

{ 
    records: { 
        Error: "SQLITE_ERROR: no such table: showcaseUsers errno: 1, code: 'SQLITE_ERROR'" 
    } 
}

实际上,它应该像这样格式化(请参阅单引号的放置)

{ 
    records: { 
        Error: 'SQLITE_ERROR: no such table: showcaseUsers',
        errno: 1, 
        code: 'SQLITE_ERROR'
    } 
}

更新:首先必须在数据库中存储格式正确的数据。如果您错过了它,那么您将不得不手动解析从SQLite获取的数据。

有用的资源