我曾经遇到过同样的错误。
在猫鼬错误处理中间件中访问 err.name 返回未定义。
我发现 err.name 仅当您使用从 mongoose 返回的原始 err 对象时才有效。
如果您通过像这样解构来创建对象的副本:
let error = {...err};
这不会包含 name 属性。 作为修复,你可以这样做:
let error = {...err, name: err.name};
它应该可以工作。
不知道为什么会发生这种情况,但如果有人知道,请告诉我! 希望这对您有帮助。
我在关注 Jonas 关于 node/express/mongoose 的教程时遇到了同样的问题。也许在某个时候,猫鼬团队决定从“错误”对象中排除“名称”属性(这只是我的猜测,不是事实)。无论如何,我克服了这个问题,如下所示:我没有检查“name”属性的值,而是检查“error”对象的“stack”属性是否以“CastError”开头。如果您使用调试器并检查 'error' 对象的所有属性,您会注意到,当 mongoose 无法使用 URL 中的 ID 来实现其目的时,'stack' 属性从单词 'CastError' 开始(显然当您在控制器中使用 ID 时)在该特定路线中)
简而言之,而不是
if(err.name === 'CastError').....
我用过
if(err.stack.startsWith('CastError')
我有同样的问题,就我而言,我更改了猫鼬版本
npm uninstall mongoose
npm i [email protected]
我不确定乔纳斯的教程是否改变了他制作硬拷贝的方式。我解决这个问题的方法是
let error = JSON.parse(JSON.stringify(err));
而不是let error = {...err}
。错误中的所有字段都可以完美复制,因此可以被其他函数使用。
let error = Object.create(Object.getPrototypeOf(err));
Object.assign(error, err);
name
属性位于err
的原型上,称为MongooseError
。复制 err
的原型,或者直接将 err.name
复制到 error
中。
我不太确定您在代码中做了什么,但看起来您基本上是在尝试为 id 字段传递一个字符串值。但是您传递的字符串不是有效的对象 ID,并且您无法将不是有效对象 ID 的字符串值传递到数据库。您需要首先检查它是否是有效的对象 ID。您可以使用
来做到这一点var ObjectID = require('mongodb').ObjectID;
ObjectID.isValid(YOUR_STRING_HERE);
您可以在这里查看官方文档 我希望它有帮助。