Mongoose CastError:模型“Post”的路径“_id”处的值“未定义”转换为 ObjectId 失败
Posted
技术标签:
【中文标题】Mongoose CastError:模型“Post”的路径“_id”处的值“未定义”转换为 ObjectId 失败【英文标题】:Mongoose CastError: Cast to ObjectId failed for value "undefined" at path "_id" for model "Post" 【发布时间】:2021-06-05 13:08:47 【问题描述】:我正在开发一个 MEAN 堆栈项目,用户可以在其中添加、编辑和删除它们。但是在执行所需的方法后,帖子没有被删除,我遇到了错误。我是 MEAN 堆栈的新手。
posts.service.ts
getPosts()
this.http.get< message: string, posts: any >('http://localhost:3300/api/posts')
.pipe(
map((postData) =>
return postData.posts.map(post=>
return
title: post.title,
content: post.content,
id: post._id
)
))
.subscribe((transformedPosts)=>
this.posts = transformedPosts;
this.postsUpdated.next([...this.posts]) //updating the posts so that it is available to the rest of the app
)
getUpdatedPostsListener()
return this.postsUpdated.asObservable()
addPosts(id: any, title: string, content: string)
const post: PostModel =
id: id,
title: title,
content: content
this.http.post< message: string >('http://localhost:3300/api/posts', post).subscribe((responseData)=>
console.log(responseData.message);
)
this.posts.push(post);
this.postsUpdated.next([...this.posts]);
deletePosts(postId: string)
this.http.delete('http://localhost:3300/api/posts/' + postId)
.subscribe(()=>
const updatedPosts = this.posts.filter(post => post.id! == postId);
this.posts = updatedPosts;
this.postsUpdated.next([...this.posts]);
)
app.js
app.delete('/api/posts/:id', (req, res, next) =>
Post.deleteOne( _id: req.params.id ).then(result =>
console.log(result);
res.status(200).json(
message: 'Post deleted successfully!'
)
)
.catch(err =>
console.log('error: ', err);
)
)
posts.components.ts
onDelete(postId: string)
this.postsService.deletePosts(postId);
posts.component.html
<mat-action-row>
<button color="primary" mat-raised-button>Edit</button>
<button color="warn" mat-raised-button (click)="onDelete(post.id)">Delete</button>
</mat-action-row>
post-models.js(用于后端)
const mongoose = require('mongoose');
const postSchema = mongoose.Schema(
title: type: String, required: true ,
content: type: String, required: true
)
module.exports = mongoose.model('Post', postSchema)
这是我每次尝试删除任何帖子时都会遇到的错误:-
错误:CastError: Cast to ObjectId 值“未定义”失败 模型“Post”的路径“_id” 在 model.Query.exec (E:\Angular\KUSpace\node_modules\mongoose\lib\query.js:4358:21) 在 model.Query.Query.then (E:\Angular\KUSpace\node_modules\mongoose\lib\query.js:4452:15) 在 E:\Angular\KUSpace\backend\app.js:48:43 在 Layer.handle [as handle_request] (E:\Angular\KUSpace\node_modules\express\lib\router\layer.js:95:5) 在下一个 (E:\Angular\KUSpace\node_modules\express\lib\router\route.js:137:13) 在 Route.dispatch (E:\Angular\KUSpace\node_modules\express\lib\router\route.js:112:3) 在 Layer.handle [as handle_request] (E:\Angular\KUSpace\node_modules\express\lib\router\layer.js:95:5) 在 E:\Angular\KUSpace\node_modules\express\lib\router\index.js:281:22 在参数处(E:\Angular\KUSpace\node_modules\express\lib\router\index.js:354:14) 在参数处(E:\Angular\KUSpace\node_modules\express\lib\router\index.js:365:14) 在 Function.process_params (E:\Angular\KUSpace\node_modules\express\lib\router\index.js:410:3) 在下一个 (E:\Angular\KUSpace\node_modules\express\lib\router\index.js:275:10) 在 E:\Angular\KUSpace\backend\app.js:22:5 在 Layer.handle [as handle_request] (E:\Angular\KUSpace\node_modules\express\lib\router\layer.js:95:5) 在 trim_prefix (E:\Angular\KUSpace\node_modules\express\lib\router\index.js:317:13) 在 E:\Angular\KUSpace\node_modules\express\lib\router\index.js:284:7 messageFormat:未定义,stringValue:'“未定义”',种类: “ObjectId”,值:“未定义”,路径:“_id”,原因:错误: 传入的参数必须是 12 字节的单个字符串或 24 个十六进制字符 在新的 ObjectID (E:\Angular\KUSpace\node_modules\bson\lib\bson\objectid.js:59:11) 在 castObjectId (E:\Angular\KUSpace\node_modules\mongoose\lib\cast\objectid.js:25:12) 在 ObjectId.cast (E:\Angular\KUSpace\node_modules\mongoose\lib\schema\objectid.js:279:12) 在 ObjectId.SchemaType.applySetters (E:\Angular\KUSpace\node_modules\mongoose\lib\schematype.js:1088:12) 在 ObjectId.SchemaType._castForQuery (E:\Angular\KUSpace\node_modules\mongoose\lib\schematype.js:1523:15) 在 ObjectId.SchemaType.castForQuery (E:\Angular\KUSpace\node_modules\mongoose\lib\schematype.js:1513:15) 在 ObjectId.SchemaType.castForQueryWrapper (E:\Angular\KUSpace\node_modules\mongoose\lib\schematype.js:1490:20) 在演员 (E:\Angular\KUSpace\node_modules\mongoose\lib\cast.js:331:32) 在 model.Query.Query.cast (E:\Angular\KUSpace\node_modules\mongoose\lib\query.js:4763:12) 在 model.Query.Query._castConditions (E:\Angular\KUSpace\node_modules\mongoose\lib\query.js:1841:10) 在模型。查询。 (E:\Angular\KUSpace\node_modules\mongoose\lib\query.js:2722:8) 在 model.Query._wrappedThunk [as _deleteOne] (E:\Angular\KUSpace\node_modules\mongoose\lib\helpers\query\wrapThunk.js:16:8) 在 E:\Angular\KUSpace\node_modules\kareem\index.js:370:33 在 processTicksAndRejections (internal/process/task_queues.js:75:11)
【问题讨论】:
您是否在浏览器检查器网络选项卡中检查了调用的 url。路径中的 id 是否正确? 请求网址:localhost:3300/api/posts/null 这是我点击删除按钮时显示的内容 好的,问题出在您的前端代码中。在您的角度代码中将对象结构记录到控制台时,它的外观如何。 【参考方案1】:简答:
如果您不想处理ObjectId
以及ObjectId
和String
之间以及id
和_id
之间的转换。
您可以使用_id
字段后端和前端。此外,要将其作为String
保存在后端,请将以下行添加到您的架构中:
_id: type: String, required: true
现在,当您创建新帖子时,您可以这样:
const post: PostModel =
_id: _id,
title: title,
content: content
然后您可以使用bson 生成新的 ObjectId 并将其传递给后端。
import ObjectID from 'bson';
_id: new ObjectID().toHexString()
【讨论】:
【参考方案2】:更改post.service.ts
中的AddPosts
方法后,问题解决
post.service.ts
addPosts(title: string, content: string)
const post: PostModel =
id: null,
title: title,
content: content
this.http.post< message: string , postId: string >('http://localhost:3300/api/posts', post).subscribe((responseData)=>
console.log(responseData.message);
post.id = responseData.postId;
this.posts.push(post);
this.postsUpdated.next([...this.posts]);
)
【讨论】:
以上是关于Mongoose CastError:模型“Post”的路径“_id”处的值“未定义”转换为 ObjectId 失败的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose CastError:模型“Task”的路径“_listId”的值“:listId”转换为 ObjectId 失败
Mongoose CastError:模型“Post”的路径“_id”处的值“未定义”转换为 ObjectId 失败
CastError:模型的路径“_id”处的值“:id”转换为 ObjectId 失败
Mongoose:CastError:在路径“items”处为值“ value:'x'”转换为嵌入失败