Node.js 使用Express.js在if语句中等待 问题

Node.js 使用Express.js在if语句中等待 问题,node.js,express,async-await,Node.js,Express,Async Await,我正在写一篇文章来练习Node.js和Docker技能,目前有以下服务器端代码: //server.js “严格使用” 常量fs=require('fs')。承诺 const express=require('express') const bodyParser=require('body-parser') const ejs=require('ejs') const app=express() 常数端口=80 use(bodyParser.urlencoded({extended:true})

我正在写一篇文章来练习Node.js和Docker技能,目前有以下服务器端代码:

//server.js
“严格使用”
常量fs=require('fs')。承诺
const express=require('express')
const bodyParser=require('body-parser')
const ejs=require('ejs')
const app=express()
常数端口=80
use(bodyParser.urlencoded({extended:true}))
app.use('/assets',express.static('/srv/opt/Linux/assets'))
app.use('/images',express.static('/srv/opt/Linux/images'))
应用程序路径(/^\/(注册)?$/)
.get(异步(请求、恢复)=>{
res.writeHead(200,{'Content-Type':'text/html'})
res.write(等待fs.readFile('/srv/opt/Linux/index.html'))
决议结束()
})
//FIXME:这会无限期地挂起连接,不知道为什么
.post(异步(请求、恢复)=>{
如果(请求正文的类型['email']!=='string'){
res.writeHead(200,{'Content-Type':'text/html'})
让template=wait fs.readFile('/srv/opt/Linux/register.ejs',{encoding:'utf8'})
res.write(ejs.render(模板,{title:'TODO',description:'TODO',contentBody:'TODO

'})) 决议结束() }否则{ //待办事项 } }) app.get('/license',异步(req,res)=>{ res.writeHead(200,{'Content-Type':'text/plain'}) res.write(等待fs.readFile('/srv/opt/Linux/LICENSE')) 决议结束() }) 应用程序侦听(端口)
当我启动并运行web服务器(我们称之为
linux rocks.com
)并访问
http://linux-rocks.com/
(或
http://linux-rocks.com/register
),网页将按预期立即加载。但是,当我向同一端点发送POST请求时(
/
/
/register
),无论我是否在POST数据中包含
电子邮件
字段,连接都会无限期挂起。我已经通过在中启动shell会话并手动运行
npm start
(在
server.js
处启动服务器)窥视了(运行web服务器的Docker容器)web服务器的内部但是,在向任一端点发出POST请求后,都不会看到任何错误或警告,因此不太可能由于错误或拒绝承诺导致服务器崩溃而挂起连接

我的服务器中的POST处理程序中导致连接挂起的问题可能是什么?我怀疑这可能与我在
if
条件中(不正确)使用
async
/
wait
有关

我试过的 我花了至少一到两个小时在谷歌上搜索相关教程和问题,内容大致是“nodejs中的异步/wait with if语句”,但没有一个搜索结果与我面临的问题完全匹配,例如,我发现许多涉及
if
语句的
async
/
await
示例的正文中通常只有一行,或者
await
就在
if
语句的前面(而不是里面)

复制
可以找到我当前的项目代码以及如何运行web服务器的说明。

正如我的问题的一些评论所提到的,我遇到挂起的原因是因为我用空电子邮件地址触发了分支机构的
else
部分(在POST数据的
email
字段中显示为空字符串)。我以为我是在通过将电子邮件字段的HTML标记的
id
更改为其他内容来触发
if
分支(例如
id=“haha”
)在提交表单之前,但后来我才意识到我应该改为更改
名称
字段(我最终这样做了,并成功触发了
if
分支,得到了预期的结果).

当您尝试在帖子的
else
部分写入响应时会发生什么?它会出现吗?请注意,通常大多数解析器都会将
req.body
中的所有内容作为字符串进行解析。因此,您的
if
永远不会执行。它会挂起,因为您在
else
中不做任何操作,而是尝试添加到
else
res.send('ok');
并查看它是否返回。我猜请求会挂起很长一段时间(直到达到超时-可能是几分钟甚至更长)因为
if
永远不会执行。如果这个假设是正确的,请尝试在条件出现之前打印正文,看看为什么会发生这种情况。@siebetman就是这样-当我认为应该触发
if
部分时,我触发了分支的
else
部分(尽管有一个陷阱)。谢谢!