这段代码可能有什么问题?我无法在 forEach 循环后获得更新的 json(变量 updatedDataJSON)输出,有人可以帮我吗?预先感谢,这是我的代码,我在这里遗漏了什么吗?
app.get('/getDifferences', (req, res) => {
let changed = false,
updatedJSON = { data: [] },
updatedDataJSON = { "url": "", "dta": "", "status": "unchanged" };
fs.readFile('output.json', 'utf-8', (err, data) => {
storedData = data && JSON.parse(data);
if (storedData) {
storedData.data.forEach((e) => {
request.get(e.url).on('res', (html) => {
updatedDataJSON.url = e.url;
updatedDataJSON.dta = e.dta;
if (e.dta && (e.dta.match(/<body[^>]*>[\s\S]*<\/body>/gi)[0] !== html.match(/<body[^>]*>[\s\S]*<\/body>/gi)[0])) {
changed = true;
updatedDataJSON.status = "changed";
updatedDataJSON.dta = html;
}
updatedJSON.data.push(updatedDataJSON);
});
});
console.log(updatedDataJSON);
}
});
res.end(JSON.stringify(updatedJSON))
});
最佳答案
Node js 是异步的。所以当get请求将被调用storedData.data length时间时,你必须在forEach循环中的get请求的callBack中结束响应。
这里我附上代码来演示这一点。
app.get('/getDifferences', (req, res) => {
let changed = false,
updatedJSON = { data: [] },
updatedDataJSON = { "url": "", "dta": "", "status": "unchanged" };
fs.readFile('output.json', 'utf-8', (err, data) => {
var count = 0,
arraylength;
storedData = data && JSON.parse(data);
if (storedData) {
arraylength = storedData.data;
storedData.data.forEach((e) => {
request.get(e.url).on('res', (html) => {
updatedDataJSON.url = e.url;
updatedDataJSON.dta = e.dta;
if (e.dta && (e.dta.match(/<body[^>]*>[\s\S]*<\/body>/gi)[0] !== html.match(/<body[^>]*>[\s\S]*<\/body>/gi)[0])) {
changed = true;
updatedDataJSON.status = "changed";
updatedDataJSON.dta = html;
}
updatedJSON.data.push(updatedDataJSON);
count++;
if (count === arraylength) {
console.log(updatedDataJSON);
res.end(JSON.stringify(updatedJSON));
}
});
});
}
});
});
关于javascript - 在每个循环 Node js 中使用请求模块不会更新我的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48421196/