当我像这样从数据库记录数据时:
router.get("/names", async (req, res) => {
ListItemsModel.find({}, function (err, items) {
items.forEach(item => {
console.log(item.name);
});
});
});
但是当我试图将它保存到数组中时,它返回给我一个空对象:
router.get("/names", async (req, res) => {
let listNames = new Array();
ListItemsModel.find({}, function (err, items) {
items.forEach(item => {
listNames.push(item.name);
});
});
console.log(listNames);
});
有人能提出解决方案吗?
ListItemsModel.find
是一个异步调用,因此在之后执行console.log(listNames);
。这就是为什么你在数组中看不到任何东西。
有两种方法可以解决这个问题。
- 由于您正在使用
async
函数来处理路由async (req, res) => {...
,您可以轻松地将find
命令的代码更改为await
。这样的:
router.get("/names", async (req, res) => {
const lists = await ListItemsModel.find();
const listNames = lists.map(x => x.name)
console.log(listNames);
});
- 这是非常明显的。只需将
console.log(listNames)
移动到回调函数中,您将获得结果。
router.get("/names", async (req, res) => {
let listNames = new Array();
ListItemsModel.find({}, function (err, items) {
items.forEach(item => {
listNames.push(item.name);
});
console.log(listNames);
});
});
你可以这样使用一个回调函数:
设置你的路由回调函数
router.get("/names", async (req, res) => {
let listNames= [];
getListItems((err,items){
if(err) console.log(err)
listNames = items.map((element){
return element.name;
})
})
});
有一个控制器来运行你的模型逻辑
getListItems(callback){
ListItemsModel.find({}, function (err, items) {
if(err){ callback(err,null)}
else{
callback(null,items);
}
});
}