Javascript + MEAN堆栈:如何在数组中正确找到“_id”字段(不是“id”)?

Posted

技术标签:

【中文标题】Javascript + MEAN堆栈:如何在数组中正确找到“_id”字段(不是“id”)?【英文标题】:Javascript + MEAN stack: How to properly find "_id" field (not "id") in array? 【发布时间】:2019-01-27 09:42:28 【问题描述】:

我有一个带有 MongoDB 的 Angular 应用程序,我从该应用程序中将数据抓取到具有一个条目的名为 books 的数组中,如下所示:

_id: "5b768f4519d48c34e466411f", name: "test", reservation: null, reserved: false, __v: 0

带有 TypeScript 接口

interface Books  
    id?: Number; 
    name: String; 
    reservation: Number; 
    reserved: Boolean; 

我正在尝试根据“_id”从该数组条目中查找保留值。另一个没有下划线的“id”变量是在按下按钮时注入 === 之后运行的代码:

findBook(id) 
      const result = this.books.find( sfid => sfid._id === id);
      console.log('reservation for this book is: ' + result.reserved);
        // todo: do something if book is reserved
    

现在这工作得很好,我得到了结果,但在 Angular 调试器中我得到以下错误:

src/app/components/index/index.component.ts(24,56) 中的错误:错误 TS2339:“书籍”类型上不存在属性“_id”。

也就是说我应该如何使用“_id”值名称正确搜索?将“sfid._id”替换为“sfid.id”不起作用。

【问题讨论】:

那么您的Books 接口/类定义是什么样的? 这个错误仅仅意味着你的Book接口没有实现_id。只需添加 _id : string; 即可。 @RobbyCornelissen:接口计算机 id?:号码;名称:字符串;预约号码;保留:布尔值; 嗯...这是Computer接口,不是Books... 您当前接受的答案只是一种绕过 TypeScript 类型检查的解决方法。 @JeremyThille 提出的解决方案更好。 【参考方案1】:

接受的答案只是让 Typescript 停止抱怨 _id 未在接口中实现的解决方法。真正的解决方法是实现它:

interface Book 
   _id : string; // <-- Add this
   name: string;
   reserved : boolean;
   reservation : any;

【讨论】:

【参考方案2】:

您可以在 javascript 中访问对象属性,如数组元素。

const result = this.books.find( sfid => sfid["_id"] === id);

试试这个吧。

【讨论】:

这行得通,但这只是让 Typescript 停止抱怨_id 没有在界面中实现的解决方法。真正的解决办法是实施它(见我的评论)【参考方案3】: 如果此问题发生在服务器端:

MongoDB 使用 ObjectIDs 作为 _id 字段,因此它不是字符串,您的 '===' 运算符将不起作用。

我的解决方案通常是在服务器端解析这些对象。 您可以通过用字符串包装对象来轻松做到这一点,因为它们实现了toString 函数:

String(yourObjectId)

所以在你的情况下:

this.books.find(sfid => String(sfid['_id']) === id)

【讨论】:

OP 明确指出代码工作正常,但 Angular(客户端)报告 TypeScript 错误。您的回答将如何解决这个问题?

以上是关于Javascript + MEAN堆栈:如何在数组中正确找到“_id”字段(不是“id”)?的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 中存储和返回 ObjectId(MEAN 堆栈)

使用 mongoose 保存子文档数组会创建空数组 MEAN 堆栈

在 MEAN 堆栈中创建搜索文章功能

如何在 MEAN 堆栈中使用 orientDB

如何在 MEAN 堆栈中调试 Mongoose 和 MongoDB?

使用MEAN堆栈