如何在nodejs中将列添加到数据库结果
How to add columns to database results in nodejs
我将 nodejs 与 mysql 和 fs 一起使用来查询数据库并通过向每一行添加一个文本文件来修改结果。我意识到我需要在这里使用一个承诺,但我不太明白。我不知道我做错了什么。到目前为止,这是我的代码:
db.query(sql, params, function(err, rows) {
if(err) {
res.status(400).json({"error": err.message});
return;
}
var data = {};
var p = new Promise(function(resolve, reject) {
rows.forEach(function(row) {
var filePath = `${contentdir}/${row.strTicketNumber}-${row.strTicketRevision}.txt`;
row.fileTxt = fs.readFile(filePath, 'utf8', function(error, content) { if(error) return ""; return content; });
data[row.intSerial] = row;
});
resolve(data);
});
p.then(function() {
res.json( data );
})
});
如果您使用同步节点 API 与它们作斗争,您可以使用 Promise
来拯救自己:
db.query(sql, params, function(err, rows) {
if(err) {
res.status(400).json({"error": err.message});
return;
}
var data = {};
rows.forEach(function(row) {
var filePath = `${contentdir}/${row.strTicketNumber}-${row.strTicketRevision}.txt`;
row.fileTxt = fs.readFileSync(filePath, 'utf8');
data[row.intSerial] = row;
});
res.json( data );
});
注意 readFileSync
而不是 readFile
或者,如果你真的想使用 Promise
s,你可以这样做:
db.query(sql, params, function(err, rows) {
if(err) {
res.status(400).json({"error": err.message});
return;
}
var data = {};
var promises = []
rows.forEach(function(row) {
var filePath = `${contentdir}/${row.strTicketNumber}-${row.strTicketRevision}.txt`;
promises.push(new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, content) => {
if (err) reject(err)
row.fileTxt = content
data[row.intSerial] = row
resolve()
});
}))
});
Promise.all(promises).then(() => {
res.json( data );
})
});
这些片段之间的主要区别在于没有。 1 同步地逐个读取每个文本文件,而 no. 2 “同时”读取它们(带有几个星号 :p)
这对您是否重要将取决于您将阅读多少文件,以及您是否发现阅读和维护第一个示例要容易得多,直到您对 Promises 更加熟悉为止。
我将 nodejs 与 mysql 和 fs 一起使用来查询数据库并通过向每一行添加一个文本文件来修改结果。我意识到我需要在这里使用一个承诺,但我不太明白。我不知道我做错了什么。到目前为止,这是我的代码:
db.query(sql, params, function(err, rows) {
if(err) {
res.status(400).json({"error": err.message});
return;
}
var data = {};
var p = new Promise(function(resolve, reject) {
rows.forEach(function(row) {
var filePath = `${contentdir}/${row.strTicketNumber}-${row.strTicketRevision}.txt`;
row.fileTxt = fs.readFile(filePath, 'utf8', function(error, content) { if(error) return ""; return content; });
data[row.intSerial] = row;
});
resolve(data);
});
p.then(function() {
res.json( data );
})
});
如果您使用同步节点 API 与它们作斗争,您可以使用 Promise
来拯救自己:
db.query(sql, params, function(err, rows) {
if(err) {
res.status(400).json({"error": err.message});
return;
}
var data = {};
rows.forEach(function(row) {
var filePath = `${contentdir}/${row.strTicketNumber}-${row.strTicketRevision}.txt`;
row.fileTxt = fs.readFileSync(filePath, 'utf8');
data[row.intSerial] = row;
});
res.json( data );
});
注意 readFileSync
而不是 readFile
或者,如果你真的想使用 Promise
s,你可以这样做:
db.query(sql, params, function(err, rows) {
if(err) {
res.status(400).json({"error": err.message});
return;
}
var data = {};
var promises = []
rows.forEach(function(row) {
var filePath = `${contentdir}/${row.strTicketNumber}-${row.strTicketRevision}.txt`;
promises.push(new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, content) => {
if (err) reject(err)
row.fileTxt = content
data[row.intSerial] = row
resolve()
});
}))
});
Promise.all(promises).then(() => {
res.json( data );
})
});
这些片段之间的主要区别在于没有。 1 同步地逐个读取每个文本文件,而 no. 2 “同时”读取它们(带有几个星号 :p)
这对您是否重要将取决于您将阅读多少文件,以及您是否发现阅读和维护第一个示例要容易得多,直到您对 Promises 更加熟悉为止。