Mongoose CastError: Cast to ObjectId failed for value "undefined" at path "_id" for model "Post"

Mongoose CastError: Cast to ObjectId failed for value "undefined" at path "_id" for model "Post"

我正在开发一个 MEAN 堆栈项目,用户可以在其中添加 post、编辑和删除它们。但是在执行了所需的方法之后,posts 没有被删除,我遇到了一个错误。我是 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)

这是我每次尝试删除任何 post:-

时都会遇到的错误

error: CastError: Cast to ObjectId failed for value "undefined" at path "_id" for model "Post" at model.Query.exec (E:\Angular\KUSpace\node_modules\mongoose\lib\query.js:4358:21) at model.Query.Query.then (E:\Angular\KUSpace\node_modules\mongoose\lib\query.js:4452:15) at E:\Angular\KUSpace\backend\app.js:48:43 at Layer.handle [as handle_request] (E:\Angular\KUSpace\node_modules\express\lib\router\layer.js:95:5) at next (E:\Angular\KUSpace\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (E:\Angular\KUSpace\node_modules\express\lib\router\route.js:112:3) at Layer.handle [as handle_request] (E:\Angular\KUSpace\node_modules\express\lib\router\layer.js:95:5) at E:\Angular\KUSpace\node_modules\express\lib\router\index.js:281:22 at param (E:\Angular\KUSpace\node_modules\express\lib\router\index.js:354:14) at param (E:\Angular\KUSpace\node_modules\express\lib\router\index.js:365:14) at Function.process_params (E:\Angular\KUSpace\node_modules\express\lib\router\index.js:410:3) at next (E:\Angular\KUSpace\node_modules\express\lib\router\index.js:275:10)
at E:\Angular\KUSpace\backend\app.js:22:5 at Layer.handle [as handle_request] (E:\Angular\KUSpace\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (E:\Angular\KUSpace\node_modules\express\lib\router\index.js:317:13) at E:\Angular\KUSpace\node_modules\express\lib\router\index.js:284:7 {
messageFormat: undefined, stringValue: '"undefined"', kind: 'ObjectId', value: 'undefined', path: '_id', reason: Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters at new ObjectID (E:\Angular\KUSpace\node_modules\bson\lib\bson\objectid.js:59:11) at castObjectId (E:\Angular\KUSpace\node_modules\mongoose\lib\cast\objectid.js:25:12) at ObjectId.cast (E:\Angular\KUSpace\node_modules\mongoose\lib\schema\objectid.js:279:12) at ObjectId.SchemaType.applySetters (E:\Angular\KUSpace\node_modules\mongoose\lib\schematype.js:1088:12) at ObjectId.SchemaType._castForQuery (E:\Angular\KUSpace\node_modules\mongoose\lib\schematype.js:1523:15) at ObjectId.SchemaType.castForQuery (E:\Angular\KUSpace\node_modules\mongoose\lib\schematype.js:1513:15) at ObjectId.SchemaType.castForQueryWrapper (E:\Angular\KUSpace\node_modules\mongoose\lib\schematype.js:1490:20) at cast (E:\Angular\KUSpace\node_modules\mongoose\lib\cast.js:331:32)
at model.Query.Query.cast (E:\Angular\KUSpace\node_modules\mongoose\lib\query.js:4763:12) at model.Query.Query._castConditions (E:\Angular\KUSpace\node_modules\mongoose\lib\query.js:1841:10) at model.Query. (E:\Angular\KUSpace\node_modules\mongoose\lib\query.js:2722:8) at model.Query._wrappedThunk [as _deleteOne] (E:\Angular\KUSpace\node_modules\mongoose\lib\helpers\query\wrapThunk.js:16:8) at E:\Angular\KUSpace\node_modules\kareem\index.js:370:33 at processTicksAndRejections (internal/process/task_queues.js:75:11) }

简答:

如果您不想处理 ObjectId 以及 ObjectIdString 之间以及 id_id 之间的转换。

您可以使用 _id 字段后端和前端。此外,要将其作为 String 保存在后端,请将以下行添加到您的架构中:

_id: { type: String, required: true }

现在,当您创建一个新的 post 时,您可以像这样:

  const post: PostModel = {
     _id: _id,
     title: title,
     content: content
   }

然后就可以使用bson生成新的ObjectId传给后台了。

import { ObjectID } from 'bson';

{ _id: new ObjectID().toHexString() }

更改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]);

  })
  
}