mysql - 获取 MySQL 和 EXPRESS 时出现异步问题
问题描述
我正在尝试在对象中简单地添加一个新属性。正在从我的数据库中获取 objs 数组,然后我尝试添加一个也从我的数据库中获取的属性。虽然当我尝试操纵它时,我收到“未定义”。
- 这确实是一个异步问题吗?
- 我在做任何愚蠢的错误吗?
这些是目前围绕在我脑海中的问题。
代码:
exports.getIndex = (req, res, next) => {
Report.fetchAll().then(([rows, fieldData]) => {
// console.log(rows);
const modifiedRows = rows.map(el => {
Report.fetchUserNameOfReport(el.UserInfo_idPessoa).then(([rows, fieldData]) => {
console.log(rows);
return {
...el,
userOfReport: 'Joao' //change later to smthing like rows.name
};
}).catch(err => console.log(err));
// return{
// ...el,
// userOfReport: 'Joao'
// };
});
res.render('user/index', { reports: rows, pageTitle: 'Social Reporter', path: '/' });
}).catch(err => console.log(err));
};
Obs 如果将其注释掉并注释 Report.fetchUserNameOfReport 函数,则此方法有效->
// return{
// ...el,
// userOfReport: 'Joao'
// };
预期结果:
{
idComplaint: 83059,
title: '4444',
description: '4444',
image: '4444',
location: '4444',
UserInfo_idPessoa: 80068,
userOfReport: 'Joao'
}
实际结果:
undefined
先感谢您!
解决方案
你永远不会在你的 中返回任何东西.map
,所以所有的值modifiedRows
都会是undefined
。您可以将它们全部映射到 Promise 以获取所有值,然后在等待所有 Promise 解决后访问修改后的行。此外,您通过多次声明rows
和隐藏变量:fieldData
exports.getIndex = (req, res, next) => {
Report.fetchAll().then(([rows, fieldData]) => {
// console.log(rows);
const modifiedRowPromises = rows.map(el => {
return Report.fetchUserNameOfReport(el.UserInfo_idPessoa).then(([rows2, fieldData2]) => {
console.log(rows2);
return {
...el,
userOfReport: 'Joao' //change later to smthing like rows2.name
};
});
});
Promise.all(modifiedRowPromises).then(modifiedRows => {
res.render('user/index', { reports: modifiedRows, pageTitle: 'Social Reporter', path: '/' });
}).catch(console.log);
}).catch(err => console.log(err));
};
或者,如果你使用async/await
语法,这可以更干净地实现:
exports.getIndex = async (req, res, next) => {
try {
const [rows, fieldData] = Report.fetchAll();
const modifiedRowPromises = rows.map(async el => {
const [rows2, fieldData2] = await Report.fetchUserNameOfReport(el.UserInfo_idPessoa);
return {
...el,
userOfReport: 'Joao' //change later to smthing like rows2.name
};
});
const modifiedRows = await Promise.all(modifiedRowPromises);
res.render('user/index', { reports: modifiedRows, pageTitle: 'Social Reporter', path: '/' };
} catch (err) {
console.log(err);
}
};
推荐阅读
- java - CVN 14 的 ARQC/ARPC 验证
- node.js - Puppeteer:无法启动浏览器进程!产卵
- javascript - 尝试通过 Three.js 模拟 3D 效果
- java - Java 应用程序中使用的 OpenCV JNI 库中的内存使用跟踪工具
- reactjs - 有没有办法对 MUI-dataTable 中的列进行分组?
- php - Increment、Decrement 以及 Model::decrement() 和 Model::increment() 在 Laravel 中无法正常工作
- oracle - 用于动态查询的 Oracle 游标
- flutter - 为什么 onTap 方法在火焰中不起作用?
- react-native - 显示为一行,除非它会溢出容器,在这种情况下显示为列?
- javascript - 在javascript中将字符串的一部分大写