在修复express.js的一些问题后重新运行请求



我的express.js应用程序与一个内部应用程序接口,该应用程序偶尔会更改其暴露的连接端口。

如果请求失败,next()将调用一个错误中间件函数,该函数检查内部应用程序的端口并在需要时更新它。

此时,我想从初始路由自动重新处理请求,即从头开始重新启动中间件堆栈。

我该怎么做呢?我只知道如何往下走中间件堆栈,但不知道如何向上走。

我可以向浏览器发送一个503 http代码,让它重试请求,但不直接在服务器上重新处理它感觉很愚蠢。

编辑附加一些代码使其更清晰:

function getInternalPort() {
... read from file current port of internal application server...
}
let port = getInternalPort()
app.get('...a route...', async (req, res) => {
try {
const result = await functionThatUsesPort()
res.json(result)
} catch (error) {
next(error)
}
}
const errorHandler = (error, request, response, next) => {
if (error.code == 'ECONNREFUSED') {
port = getInternalPort()
??? CODE TO REPROCESS THE REQUEST ???
} else {
res.json(null);
console.log(err);
}
}
app.use(errorHandler)

我不知道Express有什么功能可以让你重新启动路由。

但是,您可以创建自己的包装器函数,该函数将在重置端口后重试一次,并在您想要重试的任何请求处理程序中使用该函数。这样,您就可以自己处理重试,而不是要求Express为您做:
function getInternalPort() {
... read from file current port of internal application server...
}
async function retryUponPortError(fn, next, ...args) {
try {
const result = await fn(...args);
return result;
} catch (error) {
if (error.code === 'ECONNREFUSED') {
port = getInternalPort()
try {
const result = await fn(...args);
return result;
} catch(error) {
next(error);
}
} else {
next(error);
}
}
}
let port = getInternalPort()
app.get('/someroute', async (req, res, next) => {
const result = await retryUponPortError(functionThatUsesPort, next, arg1, arg2);
res.json(result);
}
const errorHandler = (error, request, response, next) => {
res.json(null);
console.log(err);
}
app.use(errorHandler)

注意,这段代码还使您不必在自己的请求处理程序中执行try/catch,因为这是在retryUponPortError()包装器中完成的。

注意,arg1arg2是你可能想传递给functionThatUsesPort()调用的任何参数。你可以没有任何参数,也可以想要多少就有多少。无论您在next参数之后传递给retryUponPortError()的哪个参数都将被传递给您的函数。

您可以使用next('route')重新路由请求。因此,在errorHandler函数中,只需输入next('..a route'),它将重新启动链。

相关内容

最新更新