在 mongoose 错误函数中找不到 name 属性

问题描述 投票:0回答:6

我正在尝试为 mongoose CastError 创建一个错误处理函数。错误 object 不包含指示错误类型的 name 字段,因此我无法运行 if 语句来检查它是什么类型的错误。mongoose error object

javascript node.js mongodb express mongoose
6个回答
6
投票

我曾经遇到过同样的错误。

在猫鼬错误处理中间件中访问 err.name 返回未定义。

我发现 err.name 仅当您使用从 mongoose 返回的原始 err 对象时才有效。

如果您通过像这样解构来创建对象的副本:

let error = {...err};

这不会包含 name 属性。 作为修复,你可以这样做:

let error = {...err, name: err.name};

它应该可以工作。

不知道为什么会发生这种情况,但如果有人知道,请告诉我! 希望这对您有帮助。


0
投票

我在关注 Jonas 关于 node/express/mongoose 的教程时遇到了同样的问题。也许在某个时候,猫鼬团队决定从“错误”对象中排除“名称”属性(这只是我的猜测,不是事实)。无论如何,我克服了这个问题,如下所示:我没有检查“name”属性的值,而是检查“error”对象的“stack”属性是否以“CastError”开头。如果您使用调试器并检查 'error' 对象的所有属性,您会注意到,当 mongoose 无法使用 URL 中的 ID 来实现其目的时,'stack' 属性从单词 'CastError' 开始(显然当您在控制器中使用 ID 时)在该特定路线中)

简而言之,而不是

if(err.name === 'CastError').....

我用过

if(err.stack.startsWith('CastError')

0
投票

我有同样的问题,就我而言,我更改了猫鼬版本

npm uninstall mongoose

npm i [email protected]

0
投票

我不确定乔纳斯的教程是否改变了他制作硬拷贝的方式。我解决这个问题的方法是

let error = JSON.parse(JSON.stringify(err));
而不是
let error = {...err}
。错误中的所有字段都可以完美复制,因此可以被其他函数使用。


0
投票
let error = Object.create(Object.getPrototypeOf(err));
Object.assign(error, err);

name
属性位于
err
的原型上,称为
MongooseError
。复制
err
的原型,或者直接将
err.name
复制到
error
中。


-1
投票

我不太确定您在代码中做了什么,但看起来您基本上是在尝试为 id 字段传递一个字符串值。但是您传递的字符串不是有效的对象 ID,并且您无法将不是有效对象 ID 的字符串值传递到数据库。您需要首先检查它是否是有效的对象 ID。您可以使用

来做到这一点
var ObjectID = require('mongodb').ObjectID;
ObjectID.isValid(YOUR_STRING_HERE);

您可以在这里查看官方文档 我希望它有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.