NodeJS:等待Post Request的状态码



背景:我有一个网关,如果它完全启动,它会通过post请求返回状态代码200。如果不是,则在引导时返回500。

我的想法:我有一个NodeJS应用程序,应该等到网关返回200。所以我创建了一个while循环来检查网关的状态。

我的问题:不幸的是,什么都不起作用,状态总是true。将显示请求中的非日志语句。

你有什么建议可以帮我解决这个问题吗?

while (isGatewayUnavailable()) {
log.info('waiting for gateway ...');
sleep(60)
}
function isGatwayUnavailable() {
const url = '...'
let state = true
request.post(url, (err, res, body) => {
log.debug(0)
if (err) {
log.debug("Gateway offline");
log.debug("err: " + err);
}
else if (res.statusCode === 200) {
log.debug("Gateway online");
state = false;
cb(true);
}
else {
log.debug("Status Code: " + res.statusCode);
}
});
log.debug('return state: ' + state);
return state;
}

JS中没有"等待"。只有"运行代码"one_answers"响应信号运行代码"(事件、回调、承诺(。在这种情况下,您希望基于一个您无法控制时间的进程来执行某些操作,因此您无法使用同步函数:当函数达到其return关键字时,您还没有任何信息要返回。。

因此,与其让函数返回一个值并让调用者等待该值,不如让代码"在信息进入后立即执行"。也就是说,让函数生成一个注册了处理程序的事件,或者传递一个回调作为参数,以便函数在获得必要信息后可以运行该回调,或者让它返回一个promise,一旦获得必要信息,就会调用该promise的resolve(或reject(。

1.基于事件:

const pubsub = ...;
function checkGatwayAvailability() {
request.post(url, (err, res, body) => {
pubsub.signal("gateway:availability", { available: ..., error: ... });    
});
}

带有呼叫者代码:

const pubsub = ...;
pubsub.register("gateway:availability", data => {...});
...
checkGatewayAvailability();

在这种情况下,调用它的代码和处理结果的代码是100%分离的。还要注意,pubsub不是真的。根据您的框架和API,将有不同的方法来实现事件生成/处理,或者您甚至可能需要编写自己的npm(这实际上意味着"打开npm,找到一个记录良好并被许多人使用的npm,然后使用它"(。

2.使用回调:

function checkGatwayAvailability(reportResult) {
request.post(url, (err, res, body) => {
reportResult({ available: ..., error: ... });
});
}

带有呼叫者代码:

checkGatwayAvailability( result => {
...
});

在这种方法中,调用和处理代码是耦合的,因为您的调用指向处理程序,即使您的处理程序在完全不同的地方被声明,比如:

checkGatwayAvailability(NetworkMonitor.handleGatewayResponse);

3.使用承诺:

function checkGatwayAvailability(reportResult) {
return new Promise((resolve, reject) => {
request.post(url, (err, res, body) => {
if (err) reject(err);
resolve(...);
});
});
}

带有呼叫者代码:

checkGatwayAvailability().then(result => {...}).catch(err => {...});

与回调类似,调用和处理代码是耦合的,但通过承诺,您不会"猜测"结果信息是好是坏,您实际上为"好"情况(由then处理(和"坏"情况(由catch处理(提供了单独的代码路径。

3b。通过async/await语法使用promise:

在这种情况下,request.post不返回Promise,您的函数仍然需要烘焙自己的Promise,因此使用async声明没有多大意义。我们仍然可以在调用代码中使用await关键字,不过:

try {
const result = await checkGatwayAvailability();
} catch (e) {
...
}

但仅当调用方代码本身在CCD_ 13上下文内运行时。

最新更新