我正在 Heroku 上使用 Node.js + Express 应用制作游戏。页面加载时,会提取 5 个 20MB 的 .mp3 文件中的配乐(音乐)。但有时,请求会挂起,然后抛出错误“请求中止”。这似乎与文件大小有关,因为在提取大文件时总是会发生这种情况,但这种情况只发生在某些时候(例如,20% 的时间)。
以下是简化的源代码:
// server
const app = express();
app.get('/*',
function(req, res){
req.on('close', ()=>{ write('request complete'); });
if(req.url === '/'){
// load homepage
write('sending homepage...'); res.sendFile('homepage.html', {root: __dirname}, onerr); } else
{ // send the requested file
write(`sending ${req.url}...`); res.sendFile(`${req.url}`, {root: __dirname}, onerr); }
});
// client:
let ost = [1, 2, 3, 4, 5].map(num=>new Audio(`soundtrack${num}.mp3`));
// output (randomly aborts):
sending filename1.jpg...
request complete
sending filename2.jpg...
request complete
sending soundtrack1.mp3...
request complete
sending soundtrack2.mp3...
Error: Request aborted
at onaborted (/app/node_modules/express/lib/response.js:1052:15)
at exit (/app/server.js:7:27)
at process.onerr (/app/server.js:35:43)
我试过:
- 导入 body-parser 并执行
app.use(bodyParserErrorHandler());
,但我不会在 stdout 中看到任何其他日志来解释该错误。 - 从 package.json 启动脚本调用
NODE_ENV=dev DEBUG=body-parser:*
(ChatGPT 建议我这样做但也没有帮助)。 - 我注意到 stdout 中的一些日志在错误发生后出现,显示“错误 H18:服务器请求中断”。但由于它们出现在错误发生后,因此它们可能是错误的结果,而不是原因。不过,以下是有关 H18 的详细信息,它们可能很重要:
An H18 signifies that the socket connected, and some data was sent; The error occurs in cases where the socket was destroyed before sending a complete response, or if the server responds with data before reading the entire body of the incoming request.
我检查了造成这种情况的可能原因,似乎https 通信中存在问题,而不是代码本身的问题。这可能是什么?