You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对node-ftps命令进行Promisify改造以支持async/await调用

问题:node-ftps方法Promisify改造后运行不生效原因排查

我正在尝试对node-ftps的方法进行Promisify改造,以便使用async/await语法进行调用,参考了GitHub该项目issue区的说明评论编写了如下代码,但运行未生效,请问问题出在哪里?

我编写的promisify函数代码如下:

const ftpGetFile = async (ftps, source, destination) => {
    console.log(`FTP MGET ${source} => ${destination}`)
    return ftps.raw(`mget -e -O ${destination} ${source}`).exec((error, result) => {
        return new Promise((resolve, reject) => {
            if (error) {
                console.log("ftp fget error", error)
                reject(error)
            } else {
                console.log("ftp fget succss", result)
                resolve(result)
            }
        })
    })
}

调用方式如下:

for (let index = 0; index < listToSync.length; index++) {
    // ....
    await ftpGetFile(ftp, source, destination)
    // ....
}

问题原因

你把Promise写在了exec的回调函数内部,exec方法本身不会返回Promise,你在回调里return的Promise根本不会被外层函数捕获,导致ftpGetFile返回的不是你预期的Promise对象,await自然不会生效。

修复方案

把Promise包裹在整个exec调用的外层,手动控制Promise的决议时机,修改后的代码如下:

const ftpGetFile = async (ftps, source, destination) => {
    console.log(`FTP MGET ${source} => ${destination}`)
    // 将Promise套在最外层
    return new Promise((resolve, reject) => {
        ftps.raw(`mget -e -O ${destination} ${source}`).exec((error, result) => {
            if (error) {
                console.log("ftp fget error", error)
                reject(error)
                return
            }
            console.log("ftp fget success", result)
            resolve(result)
        })
    })
}

修改后ftpGetFile会直接返回一个Promise对象,await就可以正常等待异步操作完成,循环也会按预期顺序执行。


内容的提问来源于stack exchange,提问作者ceessay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:06:00