我有一个发布路由,该路由从req.body接收字符串数组。然后,它将使用该数组并查询我的本地MySQL数据库几次,并检索一些我想发送回客户端的数据(反应),然后存储在状态中。
我遇到的问题是将数据存储在数组中,以通过res.send或res.json方法成功发送。
我认为用另一种方式处理范围可能解决了这个问题,但我对此感到困惑。
我尝试移动原始数组变量声明的位置,但是充其量res.send(aisleArr)
只能收到一个空数组。
我还尝试在push方法之前不声明'aisleArr',以为它将创建一个全局aisleArr对象,但无济于事。
router.post('/complete', (req, res) => {
const list = req.body;
let aisleArr = [];
list.map(item =>
db.item.findAll({
where: {'$item.name$': item}
})
.then(data => data.map( data =>
db.aisle.findAll({
where: {'$aisle.id$': data.dataValues.aisleId, '$aisle.storeId$': 2}
}).then( result => {
if(result[0]){
aisleArr.push(result[0].name)
}else{
console.log('no match')}})
)
)
)
res.send(aisleArr)
});
在客户端控制台中,重新发送完成后,只会收到一个空数组。
答案 0 :(得分:0)
在发送值之前,您可能需要确保map
迭代器是完整的。即使返回值与Promise链接在一起,对aisleArr
的分配也不是,并且res.send
可能在迭代器完成之前触发。使用async / await将提供一种更轻松的方法,以确保在继续操作之前完成分配。
例如:
router.post('/complete', async (req, res) => {
const list = req.body;
const aisleArr = await list.map(item =>
db.item.findAll({
where: {'$item.name$': item}
})
.then(data =>
data.map(newData =>
db.aisle.findAll({
where: {'$aisle.id$': newData.dataValues.aisleId, '$aisle.storeId$': 2}
})
.then(result => {
if (result[0].name) {
return result[0].name;
} else {
console.log('no match');
}
});
);
);
).filter(aisle => aisle);
// the filter at the end will remove null values
// (when nothing is returned from the last call to .then)
res.send(aisleArr);
});
我没有执行此操作,因此可能需要进行一两次调整,但是我希望这是一个很好的起点。总的来说,我认为需要注意的主要事情是map
在调用res.send
之前已经完成。添加更多console.logs以确保这是问题所在。