[英]unable to exit my process after completion. NodeJS
我正在開發一個 Node JS 程序來連接到遠程 SFTP 服務器以復制日志文件。 我正在使用這個 NPM 包。 ssh2-sftp-客戶端
const main = () => {
const servers = ['server list'];
servers.forEach((s) => {
const sftp = new Client();
// Connect to the server
sftp.connect({
host: s,
port: '22',
username: '',
password: '',
}).then(() => logger.log(`Connected to ${s}`))
// get list of directories
.then(() => sftp.list(rootLogPath))
.then((dirs) => {
dirs.forEach((d) => {
const target = createTargetDirectory(d.name);
// list all files in the directory
sftp.list(`${rootLogPath}/${d.name}`)
.then((files) => {
// filter only today's files
const todayFiles = files.filter((f) => f.type === '-' && moment().format('MMDDYYYY') === moment(f.modifyTime).format('MMDDYYYY'));
// copy today's files into target
todayFiles.forEach((f) => {
sftp.get(`${rootLogPath}/${d.name}/${f.name}`, `${target}/${f.name}`)
.then(() => logger.log(`Copied ${f.name} from ${d.name} located on ${s}`));
});
});
});
return sftp.end();
})
.catch(() => logger.log(`Connection to ${s} failed`));
});
};
main();
代碼按預期工作,但問題是我無法終止會話。 該程序只是在完成復制文件操作后等待。 sftp.end()
調用在復制完成之前提前關閉連接。 如果我刪除該程序,則在復制完成后等待。
我不確定在哪里編寫sftp.end()
行來終止程序。
編輯 1:使用 Promise.all 更新代碼並立即使用 async/await。
將我的代碼分成幾部分,現在使用 async/await 以獲得更好的可讀性。 程序現在結束得很好。 不再等待或掛起,但問題是文件沒有被復制。 我看到一條控制台消息“從源目錄復制文件”。
const copyTodayFiles = async (src) => {
try {
let fileList = await sftp.list(`${rootLogPath}/${src}`);
fileList = fileList.filter(
(f) => f.type === '-' && moment().format('MMDDYYYY') === moment(f.modifyTime).format('MMDDYYYY'),
);
const target = createTargetDirectory(src);
if (target) {
fileList.forEach(async (f) => {
try {
await sftp.get(`${rootLogPath}/${src}/${f.name}`, `${target}/${f.name}`);
logger.log(`Copied ${f.name}`);
} catch (error) {
logger.log(`Failed to copy ${f.name}`);
}
});
console.log(`Copied files from ${src}`);
}
} catch (error) {
logger.log(`Failed to read files from ${src}`);
logger.log(error);
}
};
const workOn = async (server) => {
sftp = new Client();
const config = {
host: server,
port: '22',
username: '',
password: '',
};
try {
await sftp.connect(config);
logger.log(`Connection to ${server} is successful.`);
const logDir = await sftp.list(rootLogPath);
Promise.all(logDir.map((d) => copyTodayFiles(d.name))).then(() => sftp.end());
// logDir.forEach(async (d) => copyTodayFiles(d.name));
} catch (error) {
logger.log(`Connection to ${server} failed.`);
logger.log(error);
}
};
const main = () => {
const servers = ['server list'];
Promise.all(servers.map((s) => workOn(s)));
};
main();
簡而言之,當你有一個承諾的“鏈”( a.then(() => b.then(() =>...
)並且你想在它們的末尾做一些事情時,你只需添加那個東西到最后一個.then
回調。
但是,如果您做出多個承諾,則需要等到所有承諾都完成,您可以使用Promise.all
( https://developer.mozilla.org/en-US/docs/Web/JavaScript/參考/Global_Objects/Promise/all ):
Promise.all([promise1, promise2]).then(...
為此,您需要將所有forEach
調用轉換為map
調用,后者返回它們創建的 promise。 一旦你這樣做了, map
操作將返回這些承諾的數組,你可以將其與Promise.all
使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.