【问题标题】:How to get property out of JavaScript object which is only appearing in console.log() but not in JSON.stringify()?如何从仅出现在 console.log() 中而不出现在 JSON.stringify() 中的 JavaScript 对象中获取属性?
【发布时间】:2019-06-30 05:57:58
【问题描述】:

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

{ 记录:{ 错误:SQLITE_ERROR:没有这样的表:showcaseUsers 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? 的答案似乎没有帮助。

【问题讨论】:

  • “我发现如何做到这一点的唯一方法是:const errorText = console.log(data);”删除console.log? const errorText=data;
  • JSON.stringify missing properties 的可能重复项我认为这应该对您有所帮助;)这看起来与您的对象一模一样!
  • @EdwardTanguay 您可能希望重新表述问题以反映真正的问题(即从错误对象中获取数据)而不是您的预期解决方案(拦截控制台)。尽管您确实问过如何“以其他方式在字符串中获取错误消息”,但所写问题的其余部分是经典的“XY 问题”。
  • 谢谢@Alnitak,我改写了标题,以便更好地反映内容和答案。

标签: javascript node.js json console.log


【解决方案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

【讨论】:

  • 感谢您的信息“错误对象的不可枚举属性”我熬夜太晚了,无法找出错误对象的消息发生了什么奇怪的事情现在我有更多信息可以挖掘更多,非常感谢
【解决方案2】:

问题是 JSON 格式错误,必须是 key:value 对。如果key:value 中的value 是一个字符串,那么它应该用单引号或双引号括起来。

{ 记录:{ 错误:SQLITE_ERROR:没有这样的表:showcaseUsers 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 获得的数据。

有用的资源

【讨论】:

  • 对,但是我从 SQLITE 数据库中获取了这个对象,所以我必须按原样处理它。如何访问对象的这个格式错误的部分?
  • 首先必须将格式正确的数据存储在数据库中。如果您错过了它,那么您将不得不手动解析从 SQLite 获得的数据。
  • 这与数据库中数据的格式没有任何关系。当 OP 说他“从 SQLITE 数据库获取这个对象”时,他的意思是它是一个由数据库引擎生成的对象,而不是一个存储在数据库中的对象。
猜你喜欢
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2011-05-04
  • 1970-01-01
相关资源
最近更新 更多