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 以及ObjectIdString 之间以及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'”转换为嵌入失败

Mongoose:(CastError)转换为 [ObjectId] 的值失败

试图在 mongoose 中填充一个嵌套数组,抛出一个看似无关的 CastError,我不明白为啥