如何解决Mongoose CastError:由于模型“Post”
我正在开发一个 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 {
消息格式:未定义,字符串值:'“未定义”',种类:
'ObjectId',值:'未定义',路径:'_id',原因:错误:
传入的参数必须是单个 12 字节的 String 或
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) }
解决方法
简答:
如果您不想处理 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() }
,
更改AddPosts
中的post.service.ts
方法后,问题解决
post.service.ts
addPosts(title: string,content: string) {
const post: PostModel = {
id: null,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]);
})
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。