当前位置: 首页 > 知识库问答 >
问题:

Mongoose CastError:模型"Post"的路径"_id"处的值"未定义"时,Cast to ObjectId失败

宋嘉懿
2023-03-14

我正在做一个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]);
  })
}

应用程序。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);
   })
    
})

帖子。组件。ts

    onDelete(postId: string){
    this.postsService.deletePosts(postId);
  }

帖子。组成部分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>

发布模型。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”处的值“未定义”失败。Query.exec(E:\Angular\KUSpace\node_modules\猫鼬\lib\query.js:4358: 21)。查询。Query.then(E:\Angular\KUSpace\node_modules\猫鼬\lib\query.js:4452: 15)在E:\Angular\KUSpace\后端\app.js:48: 43在Layer.handle[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[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参数(E:\Angular\KUSpace\node_modules\Express\lib\router\index.js:354: 14)at参数(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[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{
消息格式:未定义,stringValue:“未定义”,种类:“ObjectId”,值:“未定义”,路径:“_id”,原因:错误:传入的参数必须是12字节的单个字符串或在ObjectId. cast(E:\Angular\KUSpace\node_modules\bson\lib\bson\Obtid. js: 59:11)的castObjectId(E:\Angular\KUSpace\node_modules\mongoose\lib\cast\Obtid. js: 25:12)的新ObjectID(E:\Angular\KUSpace\node_modules\mongoose\lib\schema\Obtid. js: 279:12)上的24个十六进制字符的字符串。在ObjectId上的SchemaType. appySetters(E:\Angular\KUSpace\node_modules\mongoose\lib\schematype. js: 1088:12)。_castForQuery(E:\Angular\KUSpace\node_modules\mongoose\lib\schematype. js: 1523:15)在ObjectId。在ObjectId. castForQuery(E:\Angular\KUSpace\node_modules\mongoose\lib\schematype. js: 1513:15)。SchemaType. castForQueryWrapper(E:\Angular\KUSpace\node_modules\mongoose\lib\schematype. js: 1490:20)在演员(E:\Angular\KUSpace\node_modules\mongoose\lib\cast. js: 331:32)
在模型。查询。Query. cast(E:\Angular\KUSpace\node_modules\mongoose\lib\query. js: 4763:12)在模型。查询。_castConditions(E:\Angular\KUSpace\node_modules\mongoose\lib\query. js: 1841:10)。查询。(E:\Angular\KUSpace\node_modules\mongoose\lib\query. js: 2722:8)在模型上。查询。_wrappedThunk[作为_deleteOne](E:\Angular\KUSpace\node_modules\mongoose\lib\helers\query\wrapThunk. js: 16:8)在E:\Angular\KUSpace\node_modules\kareem\index. js: 370:33在过程TicksAndRejents(内部/过程/task_queues. js: 75:11)}

共有2个答案

邰德业
2023-03-14

更改post.service.ts中的addPosts方法后,问题得到解决

邮递服务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]);

  })
  
}
翟曦之
2023-03-14

如果您不想处理ObjectId以及ObjectIdString之间的转换,以及id\u id之间的转换。

您可以使用\u id字段后端和前端。另外,要在后端将其保存为字符串,请在架构中添加以下行:

_id: { type: String, required: true }

现在当你创建一个新帖子时,你可以这样做:

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

然后,您可以使用bson生成新的ObjectId以将其传递到后端。

import { ObjectID } from 'bson';

{ _id: new ObjectID().toHexString() }
 类似资料:
  • 我正在为一个项目使用一个样例MongoDB数据库,当使用findById mongoose方法时,我得到了错误:“CastError:Cast to ObjectId值失败”…”在“公司”模型的路径“_id”处。我使用车把作为查看引擎。 错误 中间件文件: 这是路由文件

  • Comments是嵌套在Post架构中的数组。我想通过推送一个新的评论到评论数组更新相应的帖子。但是得到了错误:CastError:对于模型“post”的路径“_id”处的值“comments”,向ObjectId的强制转换失败 阅读相关帖子 尝试使用“mongoose.types.objectid”,但不起作用 猫鼬版^5.5.4 我在这里使用的所有ID都是有效的 我认为问题出在“comment

  • 我看到了几个帖子与类似的我但我仍然得到同样的错误 这是我的用户模式 我的路线 我的应用程序。js 这是我的护照。我正在使用本地护照 passport可以将用户保存到数据库中 模型“用户”的路径“_id”处的值“586cc8b3ea780c071bbe2469”转换为ObjectId失败 我已经构建了两个应用程序,它们使用passport oauth,与上面显示的方式完全相同。所以我不知道为什么我会

  • 我试图通过id从mongo检索数据,但当我添加外部链接(如样式文件或脚本文件)时,它工作正常,我收到此错误消息。 消息:“对模型“Blog”路径“_id”处的值“script.js”的转换失败,名称:“CastError”,stringValue:“script.js”,种类:“ObjectId”,值:“script”。js',路径:''u id',原因:未定义,模型:

  • 嘿,伙计们真的需要一些关于删除路由的帮助。我正在使用RESTful路由,尝试遵循约定,添加删除路由时,我得到错误: CastError:模型"Blog"的路径"_id"处的值"X"转换为ObjectId失败 我已经在stackoverflow上搜索了这个问题,我能想到的最好的版本是猫鼬有一个错误。我把它回滚到V4.10.0,仍然在处理这个问题。我的代码如下:

  • 前言:我对猫鼬/Express的工作相对来说是新手。 我试图制作一个应用程序,其中一个名为“space”的猫鼬模式中有一个名为“posts”的数组。数组的内容是对另一个名为“POST”的猫鼬模式的ObjectId引用。然而,每次我对应该发送回我的空间和其中的帖子的路线提出GET请求时,我都会得到一个严重的错误。此外,我的帖子没有填充我的空间。 错误:CastError:对于模型“space”的路径