我想在所有数据都将被处理时退出节点进程(获取数据,带有axios的http请求和更新数据)。当我通过输入node script.js
运行脚本时,它永远不会结束。我应该在脚本的哪里使用process.exit()来确保已处理所有数据?以下脚本:
Keyword.find({
images: {
$eq: []
}
})
.limit(8)
.exec((err, keywords) => {
keywords.forEach((keyword) => {
console.log(keyword.body);
axios.get('https://www.example.com/?q=' + encodeURIComponent(keyword.body))
.then(function (response) {
const dom = new JSDOM(response.data);
let items = dom.window.document.querySelectorAll('div.item');
let images = [];
items.forEach(((item) => {
let url = item.querySelector('a.thumb').href;
let source = item.querySelector('a.tit').href;
let description = item.querySelector('div.des').innerHTML;
images.push({
url,
source,
description
});
}));
Keyword.findByIdAndUpdate({
_id: keyword._id
}, {
$set: {
images
}
}, (err2, result2) => {
if (err2) console.log(err2);
console.log(result2);
});
})
.catch(function (error) {
console.log(error);
});
});
});
答案 0 :(得分:1)
从文档中
process.exit()方法指示Node.js以代码的退出状态同步终止进程。如果省略代码,则退出将使用“成功”代码0或process.exitCode的值(如果已设置)。在调用所有“退出”事件侦听器之前,Node.js不会终止。
要以“失败”代码退出:
process.exit(1);
答案 1 :(得分:0)
似乎您的数据库连接使您的应用程序无法自动退出。
因此,您应该在完成工作后关闭数据库连接或致电process.exit()
。
您正在同时执行多个异步操作
keywords.forEach((keyword) => {
axios.get(...
要在所有操作完成时收到通知,您可以创建一个Promise数组,并通过Promise.all()
方法来监听它们
const operations = keywords.map((keyword) => axios.get('').then((response) => {
...
return new Promise((resolve, reject) => {
Keyword.findByIdAndUpdate(query, update, (err2, result2) => {
if (err2) {
console.log(err2);
reject(err2);
}
console.log(result2);
resolve();
});
});
}));
Promise.all(operations).then(()=>{
console.log('All done.');
process.exit();
});