微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

节点:等到函数完成后再执行process.exit

如何解决节点:等到函数完成后再执行process.exit

我是Node的新手。我写了一个执行telnet的脚本。如果telnet有效,我们将执行traceroute并正确退出(可行)。当telnet不起作用时,我仍然会执行traceroute并尝试以退出状态-1退出。这是行不通的。跟踪路由未显示,并且process.exit(1)出现得太早/不等到跟踪路由的输出

这是我的脚本(是lambda):

'use strict';
const Traceroute = require('nodejs-traceroute');
const isPortReachable = require('is-port-reachable');

console.log('Loading function');
process.env.PATH = `${process.env.PATH}:${process.env.LAMBDA_TASK_ROOT}/bin`;


async function doTraceroute() {
    try {
        const tracer = new Traceroute();
        tracer
            .on('pid',(pid) => {
                console.log(`pid: ${pid}`);
            })
            .on('destination',(destination) => {
                console.log(`destination: ${destination}`);
            })
            .on('hop',(hop) => {
                console.log(`hop: ${JSON.stringify(hop)}`);
            })
            .on('close',(code) => {
                console.log(`close: code ${code}`);
            });
    
        tracer.trace('100.216.125.9');
    } catch (ex) {
        console.log(ex);
    }
}

exports.handler = (event,context,callback) => {
    (async () => {
        console.log('Is port 9092 reachable of MC Kafka host? True or False')
        let output = await isPortReachable(9092,{host: '100.216.125.9'})
        if (output) {
            console.log('Telnet worked: do traceroute')
            await doTraceroute();
        } else {
            console.log('Telnet Failed: do traceroute')
            await doTraceroute();
            console.log("Exit with error")
            process.exit(1)
        }
    })();
};

我该如何解决? telnet失败时的当前输出为:

START RequestId: 315b0ac5-09d7-4b72-8ff7-746b28241f79 Version: $LATEST
2020-11-09T07:25:07.841Z    315b0ac5-09d7-4b72-8ff7-746b28241f79    INFO    Is port 9092 reachable of MC Kafka host? True or False
2020-11-09T07:25:08.851Z    315b0ac5-09d7-4b72-8ff7-746b28241f79    INFO    Telnet Failed: do traceroute
2020-11-09T07:25:08.909Z    315b0ac5-09d7-4b72-8ff7-746b28241f79    INFO    pid: 20
2020-11-09T07:25:08.910Z    315b0ac5-09d7-4b72-8ff7-746b28241f79    INFO    Exit with error
END RequestId: 315b0ac5-09d7-4b72-8ff7-746b28241f79
REPORT RequestId: 315b0ac5-09d7-4b72-8ff7-746b28241f79  Duration: 1150.28 ms    Billed Duration: 1200 ms    Memory Size: 128 MB Max Memory Used: 70 MB  Init Duration: 176.80 ms    
RequestId: 315b0ac5-09d7-4b72-8ff7-746b28241f79 Error: Runtime exited with error: exit status 1
Runtime.ExitError

显示跟踪路由。当telnet成功并且没有出口1时,将显示traceroute。

解决方法

您可以将traceroute处理包装在一个promise中,然后等待该promise:

function doTraceroute() {
    return new Promise((resolve,reject) => {
        try {
            const tracer = new Traceroute();
            tracer
                .on('pid',(pid) => {
                    console.log(`pid: ${pid}`);
                })
                .on('destination',(destination) => {
                    console.log(`destination: ${destination}`);
                })
                .on('hop',(hop) => {
                    console.log(`hop: ${JSON.stringify(hop)}`);
                })
                .on('close',(code) => {
                    console.log(`close: code ${code}`);
                    resolve();
                });

            tracer.trace('100.216.125.9');
        } catch (ex) {
            console.log(ex);
            reject(ex);
        }
    });
}

然后您可以await返回的承诺:

await doTraceroute();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。