所以我遇到了一个意想不到的错误,困惑了一段时间,直到我在一个非常不起眼的 github issue page上找到了解决方案。
我有一个使用 Express 服务器运行的 NodeJS 应用程序,该服务器基本上处理一个发布点。我的问题是 NodeJS 应用程序会随机冻结,我的任何请求都不会通过,如果我注意到它,我可以进入命令提示符并按“Control + c”,它会杀死一些隐藏进程并继续正常操作,如果有任何对 post 端点的调用,然后它会在它们刚刚排队时执行所有这些调用。
我找到了答案,是命令提示符本身,当您在窗口中单击“管理员:命令提示符 -...”时,会变成“选择管理员:命令提示符 -...”。当它具有该选择属性时,快递服务器会冻结并拒绝回答任何更多请求。
我发现执行“Control + c”或按 Esc 将摆脱“Select”关键字,然后应用程序恢复正常运行。请注意,如果您在那里有“选择”关键字并且您只是单击另一个窗口或应用程序,它不会摆脱它,除非
我假设当您在命令提示符中单击以突出显示文本或复制时,它会生成另一个进程来冻结控制台,以便您能够捕获那里的内容,因此如果您的应用程序将任何文本生成到 cmd 行,它将挂起直到您已完成从 cmd 行“选择”信息。这就是为什么您需要“Control + c”退出此标记过程或按 Esc 表示您已完成 cmd 行的标记。
这是否与 cmd 行运行节点应用程序的方式有关?它与 NodeJS 应用程序有关吗?是否与快递服务器拒绝确认 POST 请求直到完成有关?我真的很好奇为什么会发生这种情况,并且想要更深入的解释?
编辑:我刚刚删除了我的大部分代码并在此处进行了测试,如果您单击 cmd 窗口,它将不会响应请求并且只会挂起,直到您控制 C 或 Esc。
const http = require('http');
const express = require('express');
const bodyParser = require('body-parser'); //Needed to parse content of Text
const app = express();
app.use(bodyParser.urlencoded({
extended: false
})); //Needed to parse content of Text
const {
IncomingForm
} = require("formidable");
app.post('/plex', async (req, res) => {
console.log("test");
res.end('It worked!');
});
http.createServer(app).listen(1338, () => {
console.log('Express server listening on port 1338');
});

