4

我正在使用 ssh2 连接到远程 sftp 服务器。代码如下所示:

fetchFileList() {
    return new Promise((resolve, reject) => {
        const sshClient = new Client();
        let isReady = false;
        logger.info("fetchFileList making SF connection");
        sshClient.on("ready", () => {
            isReady = true;
            logger.info("Ready");
            sshClient.sftp((err, sftp) => {
            if (err) {
                logger.error("Some error occoured ", { err });
                reject("Error establishing sftp connection");
            }
            logger.info("Sftp connection is successful");
            sftp.readdir(CONST.EXTRACT.FTP_DIRECTORY, (err, files) => {
                if (err) {
                reject(new CustomError("Sftp read dir", err));
                }
                // Read all file 'formats' from entity db
                sortFilesByTables(files)
                .then(result => {
                    resolve({ sshClient, sftp, result });
                })
                .catch(err => {
                    reject(new CustomError("Error sorting files by tables ", err));
                });
            });
            });
        });
        sshClient.on("error", err => {
            logger.error("Error connecting to sftp server ", err);
            webHook
            .send(
                utils.composeSlackMessage(
                "Error connecting to sftp server",
                CONST.EXPORT.SLACK_MESSAGE_TYPES.ERROR,
                err
                )
            )
            .catch(err => logger.error("Webkook catch ", err));
            reject(new CustomError("Error connecting to sftp server ", err));
        });

        sshClient.on("end", () => {
            if (!isReady) {
            logger.error(
                "fetchFileList on end Callback could not establish sftp connection"
            );
            reject(
                "fetchFileList on end Callback could not establish sftp connection"
            );
            }
        });

        sshClient.connect({
            host: ftpCredentials.host,
            port: ftpCredentials.port,
            username: ftpCredentials.username,
            password: ftpCredentials.password,
            readyTimeout: 90000
        });
    });
}

有时在尝试连接时,会调用 end 回调,但不会调用 error 或 ready 回调。有谁知道为什么会这样?当无法与 sftp 服务器建立连接时,不应该发生错误回调吗?(之前我只有准备好和错误回调,在这种情况下都没有被调用,我的服务器程序挂在这个 Promise 中)。

我正在使用的节点模块是"ssh2": "^0.6.1"

4

0 回答 0