我想使用 ecs 部署我的应用程序,我使用一个任务定义。 当我与 Fargate 一起使用时,它可以工作,但与 ec2 一起使用时,我收到此错误:
Server is running on port 8080
node:internal/process/promises:289
triggerUncaughtException(err, true /* fromPromise */);
^
[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "#<Object>".] {
code: 'ERR_UNHANDLED_REJECTION'
}
Node.js v20.10.0
然后我尝试 ssh 到 ec2 实例并使用 docker 命令运行图像,它也能工作。 我正在使用 x86 架构和 t2.medium 实例。
如评论所述,请确保 Node.js 应用程序中的所有承诺都具有正确的
.catch()
块 或位于异步函数中的 try...catch
内。无论当前问题如何,这都是一个很好的实践,如 Lucy Mitchell的“使用
.then()
、.catch()
、.finally()
处理 JavaScript Promises 中的错误”中所示。
但是,根据您的情况,比较 EC2 和 Fargate 之间的环境(环境变量、配置、Node.js 版本、内存/CPU,...)。有时,环境设置的细微差异可能会导致此类问题。
此外,向您的应用程序添加更多日志记录以捕获有关环境和执行流程的详细信息。再次,在 EC2 或 Fargate 上执行后比较这些日志。
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
// Application specific logging, throwing an error, or other logic here
});
例如,这个问题表明代码适用于 Node 14,而不适用于 Node 18。
自从 Node.js 15 更新了其对拒绝的处理...不同的 Node 版本可以解释为什么它在一种环境中工作,而不是在另一种环境中工作。