我的问题是,我想使用某个循环对 JSON 中的每个对象进行 INSERT 查询,但我几乎总是收到错误消息“将 header 发送到客户端后无法设置”。有人可以帮忙吗?Tnx
const connection = require('./config');
module.exports.excel = function (req, res) {
var _query = 'INSERT INTO excel (id, first_name, last_name) values ?';
var jsonData = req.body;
var values = [];
function database() {
return new Promise((resolve, reject) => {
jsonData.forEach((value) => {
values.push([value.id, value.first_name, value.last_name]);
connection.query(_query, [values], (error, results) => {
if (error) {
reject(
res.json({
status: false,
message: error.message
}))
} else {
resolve(
res.json({
status: true,
data: results,
message: 'Excel file successfully created in database'
}))
}
});
});
})
}
async function write() {
await database();
}
write();
}
在我从 Angular 6 前端获取 JSON 后,我将 req.body 放入 jsonData 并尝试使用 forEach 将每个对象(在本例中为“值”)放入查询并将其写入 Excel 文件。
最佳答案
您必须将每个查询
包装在Promise
中并等待所有完成,然后使用 Promise.all
发送 response
并不是说 database()
会在其中一个查询失败时throw
并且您将无法访问已解决的 promise 。
const connection = require('./config');
module.exports.excel = function(req, res) {
const _query = 'INSERT INTO excel (id, first_name, last_name) values ?';
const jsonData = req.body;
function database() {
return Promise.all(
jsonData.map(
value =>
new Promise((resolve, reject) => {
const values = [value.id, value.first_name, value.last_name]
connection.query(_query, [values], (error, results) => {
if (error) {
reject(error.message);
return;
}
resolve(results);
});
})
)
);
}
async function write() {
try {
const results = await database();
res.json({
status: true,
data: results,
message: 'Excel file successfully created in database'
});
} catch (e) {
res.json({
status: false,
message: e.message
});
}
}
write();
};
关于javascript - 使用 for 或 forEach 查询 json 中的每个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57563824/