【发布时间】:2020-12-25 15:27:58
【问题描述】:
我正在尝试构建一个由单独的 React 前端使用的 REST api。在一个页面上,我需要从单个 mongo 数据库中的不同集合中提取数据,并将其捆绑在一起,然后再将响应返回给前端,以最大限度地减少 api 调用。我的数据库中有以下集合:
- 用户
- 项目
其中每一个的数据结构如下:
- 用户集合 =
[{id: ObjectId, completedItems=[ObjectId, ObjectId, ...], ...}] - ItemsCollection =
[{id: ObjectId, name: string, ...}]
在我的 node/express 应用程序中,我想做一个调用来获取所有用户,对于每个用户,在返回响应之前查询项目集合以提取每个项目的名称。
当我最终返回响应时,我希望能够返回以下结构的对象,但不改变我存储数据的结构。
回复 = [{id: ObjectId, completedItems=[{id: ObjectId, name: string}, {id: ObjectId, name: string}]}]
我遇到的问题是,当我进行此调用时,当用户的 completedItems 数组中没有项目时,整个后端在尝试进行第二次 api 调用时崩溃,我最终得到诸如“Cannot read property 'name' of null”之类的错误消息。
我假设我在这里遗漏了某种错误处理,或者我可能没有以正确的方式考虑整体结构。
由于这是我的第一个主要 REST api,我不知道我是否应该在返回响应之前尝试在后端合并这些信息,或者我是否应该在前端处理这个,返回一个响应用户调用前端,然后对后端进行第二次 api 调用以获取项目数据。
任何指导将不胜感激!
'''lang-js
const getUsers = async (req, res, next) => {
let users
try {
users = await User.find({}, {name:1, items: 1})
} catch (err) {
return next(new Error('Could not fetch inductions').code(500))
}
for (let i in users){
let {id, name, items} = users[i]
item = await Item.findById(item, {name:1})
}
users[i] = {
id: id, name: name, item: {
name: item.name, id: item.id
}
}
}
'''
【问题讨论】:
-
请您分享您用于此功能的代码
-
''' const getUsers = async (req, res, next) => { 让用户尝试 { users = await User.find({}, {name:1, items: 1}) } catch (err) { return next(new Error('Could not fetchductions').code(500)) } for (let i in users){ let {id, name, items} = users[i] item = await Item .findById(item, {name:1}) } users[i] = { id: id, name: name, item: {name: item.name, id: item.id} } '''
-
道歉 - 我显然也不知道如何在 cmets 中添加代码块...
-
只需编辑您的问题并使用 {} 格式化您的代码
标签: node.js mongodb rest express