node.js - 如何响应 Node/Express/Postgresql 中的查询结果数组?
问题描述
新手在这里。我正在尝试通过两个select
查询从本地数据库中获取对象数组,使用 knex.js 和 postgresql,如下所示:
app.get('/trips/:name', (req, res) => {
const {name} = req.params;
db.select('tripid').from('member')
.where('name', '=', name)
.then(data => {
const array = data.map(elem => {
db.select('tripname')
.from('trip')
.where('id', '=', elem.tripid)
.then(obj => {
array.push(obj[0])
})
})
return array
})
.then(arr => res.json(arr))
.catch(err => res.status(400).json(err))
})
我想将第二个查询返回的所有对象推入一个数组并响应前端。但是,它总是返回一个空数组,我怀疑这
.map
是异步的,所以在循环完成之前返回数组。我怎样才能解决这个问题?任何帮助表示赞赏。谢谢。抱歉,如果我的代码难以阅读。
解决方案
使用 async await 尝试这种方式:
app.get('/trips/:name', async (req, res) => {
try{
const {name} = req.params;
let arr = await db.select('tripid').from('member').where('name', '=', name);
if(arr && arr.length>0){
for(let item of arr){
let tripResult = await db.select('tripname').from('trip').where('id', '=', item.tripid).catch(e=>e);
item.trip = tripResult && tripResult[0]? tripResult[0]:null;
}
}
return res.json(arr);
}catch(error){
return res.status(400).json(error);
}
}
第二种方式:
app.get('/trips/:name',(req, res) => {
const {name} = req.params;
db.select('tripid').from('member').where('name', '=', name)
.then(arr =>{
Promise.all(arr.map(item =>{
db.select('tripname')
.from('trip')
.where('id', '=', item.tripid)
.then((tripResult=>{
item.trip = tripResult && tripResult[0]? tripResult[0]:null;
return item;
}).catch(e=>e);
})
).then(arr => {
return res.status(200).json(arr);
})
}).catch(err => res.status(400).json(err));
推荐阅读
- java - NavigationDrawer 内的 RecyclerView 不滚动
- ruby-on-rails - 如何在 rake 任务上运行 sorbet typecheck
- python - Python Flask request.data 仅返回字符串
- c - C 是否保证 32 位整数运算?
- r - 从字符串中删除第一个字母字符
- node.js - bcrypt.compare 总是返回 false
- javascript - 如何在查询 Firestore 数据库之前检查参数的有效性?
- javascript - Mapbox 自定义样式未正确显示
- javascript - 在 Node 中获取整个堆栈跟踪
- excel - Excel 名称字符限制