这是我的密码
app.post("/hi",(req, res)=>{
const schema = Joi.object({
name: Joi.string().min(2).required()
});
const result=schema.validate(req.body);
if(result.error){
res.status(400).send(result.error);
return;
}
console.log(req.body);
});
const port=process.env.PORT || 3000
app.listen(port, ()=>{
console.log("listening on port "+port );
});
它只监听本地主机上的端口3000,并将请求的主体记录到控制台中。当我通过Postman发送任何请求时,除了输出“undefined”之外,它工作正常。为什么会这样?这是我的代码的问题还是我使用Postman的问题?
2条答案
按热度按时间mtb9vblg1#
默认情况下,Express不读取POST请求的主体(或任何与此相关的请求)。因此,您必须安装一些软件(通常是中间件),以识别传入请求主体的特定内容类型,从传入流中读取主体,解析它,并将结果放置在您期望的位置(通常是
req.body
)。如果没有这样的中间件,那么
req.body
将是空的,请求的主体将保留在传入流中,而不会被Express读取。最终,当您终止请求或传入请求超时时,它将被丢弃。在这种情况下,您不需要显示POST所发送的内容类型,但是Express提供了一些内置的中间件,您可以将其用于多种类型:
您只需确保适当的中间件是请求处理程序的一部分,或者安装在它之前。
如果您在这里的特定POST是直接从浏览器发布的表单,则它将是
application/x-www-form-urlencoded
,您可以执行以下任一操作:或以下内容:
您可以在这里看到Express提供的各种类型的内容解析中间件。
biswetbf2#
因此,对于像我这样已经搜索了一段时间的人来说,确保发送的帖子请求的类型是application/json。例如,我使用的是postman,默认情况下,当我将其更改为json时,它被设置为text for body,工作正常。