javascript js对象的奇怪行为,无法从键获取值

cbjzeqam  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(122)

在fastify + posterre上编写后端时遇到了一个小问题。我在一个网站上有一个用户注册功能,它在引擎盖下向Posterre提供数据。我现在正在优化错误处理,但遇到了一个问题。我想从对象“err”中获取数据。
在我的例子中,对象“err”看起来像这样:

err: {
      "type": "DatabaseError",
      "message": "duplicate key value violates unique constraint \"users_login_key\"",
      "stack":
          error: duplicate key value violates unique constraint "users_login_key"
              at C:\Users\galec\Dev\Lottery\backend-lottery\node_modules\pg\lib\client.js:526:17
              at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
              at async file:///C:/Users/galec/Dev/Lottery/backend-lottery/src/routes/register.js:46:13
      "length": 202,
      "name": "error",
      "severity": "ERROR",
      "code": "23505",
      "detail": "Key (login)=(alaverdyan) already exists.",
      "schema": "public",
      "table": "users",
      "constraint": "users_login_key",
      "file": "nbtinsert.c",
      "line": "649",
      "routine": "_bt_check_unique"
    }

字符串
将新用户事务处理到Posterre表“users”中时发生错误。原则上这并不重要,因为我是故意造成错误的,但为了以防万一,我会给予你一段函数代码:

try {

  // database transaction logic

} catch (err) {
  app.log.error({
    msg: `Error adding user '${login}' to table 'users'`,
    'Error code': err.code,
    'Error type': err.type,
    'Message': err.message,
    'Detail': err.detail,
    'DB table': err.table,
    'DB constraint': err.constraint,
    'Stack': err.stack,
  })
}


我最终得到一个缺少类型字段的对象:


的数据
还不止这些。如果我们调用下面的命令,我们会得到一个有趣的结果。

app.log.error(err) // will output an 'err' object with a 'type' field
app.log.error({ err: err }) // will output an 'err' object with a 'type' field
app.log.error({ error: err }) // prints the 'err' object without the fields 'type ', 'message' and 'stack'


屏幕截图:app.log.error(err)app.log.error({ err: err })app.log.error({ error: err })的一个或多个。
我做了一期皮诺·吉塔布的事。我还没有回答。
会有什么问题呢?为什么我无法访问错误类型?

z4bn682m

z4bn682m1#

下面是完整的解释。
首先,重复问题:

const Pino = require('pino')
const pg = require('pg')

const pino = Pino({
  serializers: {
    err: Pino.stdSerializers.err
  }
})

const myErr = new pg.DatabaseError('err-msg', 42, 'err-name')

pino.info('\n------------------: pino.error')
pino.error(myErr) // will output an 'err' object with a 'type' field

pino.info('\n------------------: pino.error({err})')
pino.error({ err: myErr }) // will output an 'err' object with a 'type' field

pino.info('\n------------------: pino.error({error})')
pino.error({ error: myErr }) // prints the 'err' object without the fields 'type ', 'message' and 'stack'

字符串
然后我意识到DatabaseError没有任何type prop :

const myErr = new pg.DatabaseError('err-msg', 42, 'err-name')
console.log("Has own property 'type'?", Object.hasOwnProperty.call(myErr, 'type'))
console.log("Is 'type' in error?", 'type' in myErr)
console.log('Object.getOwnPropertyNames:', Object.getOwnPropertyNames(myErr))
console.log("Value of 'type':", `${myErr.type}`)
console.log("Is 'type' enumerable?", Object.propertyIsEnumerable.call(myErr, 'type'))


pg源代码证实了这一点
通过阅读构造函数名称,实现pinotype的相加:


的数据
会有什么问题呢?为什么我无法访问错误类型?
因此,要在errerror之间获得相同的输出,您需要更新serialzier选项:

const pino = Pino({
  serializers: {
    err: Pino.stdSerializers.err,
    error: Pino.stdSerializers.err
  }
})


要读取type,您需要编写以下命令:

const errType = myErr.constructor.name

相关问题