gpt4 book ai didi

javascript - Node HTTP 请求永远挂起

转载 作者:搜寻专家 更新时间:2023-10-31 23:51:19 25 4
gpt4 key购买 nike

我们有一个每分钟运行一次的 Node.js 脚本来检查我们应用程序的状态。通常,它工作得很好。如果服务启动,它以 0 退出。如果它关闭,它以 1 退出。一切正常。

但每隔一段时间,它就会停止。控制台报告“调用状态 API...”并无限期地停在那里。它甚至不会在 Node 内置的两分钟超时时超时。没有错误,什么都没有。它只是坐在那里,等待,永远。这是一个问题,因为它阻止了后续状态检查作业的运行。

在这一点上,我的整个团队都看过它,但我们都不知道什么情况会导致它挂起。我们内置了一个开始到完成的超时时间,这样我们就可以继续下一个工作,但这实际上跳过了状态检查并产生了盲点。所以,我向你们好人开放这个问题。

这是脚本(删除了名称/网址):

#!/usr/bin/env node

// SETTINGS: -------------------------------------------------------------------------------------------------
/** URL to contact for status information. */
const STATUS_API = process.env.STATUS_API;

/** Number of attempts to make before reporting as a failure. */
const ATTEMPT_LIMIT = 3;

/** Amount of time to wait before starting another attempt, in milliseconds. */
const ATTEMPT_DELAY = 5000;

// RUNTIME: --------------------------------------------------------------------------------------------------
const URL = require('url');
const https = require('https');

// Make the first attempt.
make_attempt(1, STATUS_API);

// FUNCTIONS: ------------------------------------------------------------------------------------------------
function make_attempt(attempt_number, url) {
console.log('\n\nCONNECTION ATTEMPT:', attempt_number);
check_status(url, function (success) {
console.log('\nAttempt', success ? 'PASSED' : 'FAILED');

// If this attempt succeeded, report success.
if (success) {
console.log('\nSTATUS CHECK PASSED after', attempt_number, 'attempt(s).');
process.exit(0);
}

// Otherwise, if we have additional attempts, try again.
else if (attempt_number < ATTEMPT_LIMIT) {
setTimeout(make_attempt.bind(null, attempt_number + 1, url), ATTEMPT_DELAY);
}

// Otherwise, we're out of attempts. Report failure.
else {
console.log("\nSTATUS CHECK FAILED");
process.exit(1);
}
})
}

function check_status(url, callback) {
var handle_error = function (error) {
console.log("\tFailed.\n");
console.log('\t' + error.toString().replace(/\n\r?/g, '\n\t'));
callback(false);
};

console.log("\tCalling status API...");
try {
var options = URL.parse(url);
options.timeout = 20000;
https.get(options, function (response) {
var body = '';
response.setEncoding('utf8');
response.on('data', function (data) {body += data;});
response.on('end', function () {
console.log("\tConnected.\n");
try {
var parsed = JSON.parse(body);
if ((!parsed.started || !parsed.uptime)) {
console.log('\tReceived unexpected JSON response:');
console.log('\t\t' + JSON.stringify(parsed, null, 1).replace(/\n\r?/g, '\n\t\t'));
callback(false);
}
else {
console.log('\tReceived status details from API:');
console.log('\t\tServer started:', parsed.started);
console.log('\t\tServer uptime:', parsed.uptime);
callback(true);
}
}
catch (error) {
console.log('\tReceived unexpected non-JSON response:');
console.log('\t\t' + body.trim().replace(/\n\r?/g, '\n\t\t'));
callback(false);
}
});
}).on('error', handle_error);
}
catch (error) {
handle_error(error);
}
}

如果你们中的任何人能看到任何可能在没有输出或超时的情况下挂起的地方,那将非常有帮助!

谢谢,詹姆斯坦纳

编辑:我们直接使用https,而不是request,这样脚本运行时就不需要做任何安装。这是因为脚本可以在分配给 Jenkins 的任何构建机器上运行,无需自定义安装。

最佳答案

你是不是错过了 .end()

http.request(options, callback).end()

类似解释 here .

关于javascript - Node HTTP 请求永远挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46281350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com