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 使用 ObjectID
s 作为 _id
字段,因此它不是字符串,您的 '===' 运算符将不起作用。
我的解决方案通常是在服务器端解析这些对象。
您可以通过用字符串包装对象来轻松做到这一点,因为它们实现了toString
函数:
String(yourObjectId)
所以在你的情况下:
this.books.find(sfid => String(sfid['_id']) === id)
【讨论】:
OP 明确指出代码工作正常,但 Angular(客户端)报告 TypeScript 错误。您的回答将如何解决这个问题?以上是关于Javascript + MEAN堆栈:如何在数组中正确找到“_id”字段(不是“id”)?的主要内容,如果未能解决你的问题,请参考以下文章
在 MongoDB 中存储和返回 ObjectId(MEAN 堆栈)
使用 mongoose 保存子文档数组会创建空数组 MEAN 堆栈