返回

Hapi和Joi升级后请求验证失败?可能是处理请求有效负载方式变了

javascript

Hapi和Joi升级导致的请求验证问题

问题概要

在将Hapi从18.1.0升级到21.3.3,并将Joi从13.7.0升级到17.12.2后,使用text/plain;charset=UTF-8内容类型的POST请求会引发400错误,提示"payload" must be of type object

原因分析

升级后的Hapi和Joi改变了对请求有效负载的处理方式。在旧版本中,text/plain内容类型的有效负载会被自动解析为对象。现在,这种解析不再自动进行,需要手动解析或使用不同的内容类型(例如application/json)。

解决方案

有几种方法可以解决此问题:

  • 修改客户端应用程序: 更改客户端应用程序以使用application/json内容类型发送请求。这符合Hapi和Joi的新处理方式。

  • 使用hapi-payload插件: 安装hapi-payload插件并在路由配置中添加payload预处理函数。它将自动将text/plain有效负载解析为对象。

  • 编写自定义验证函数: 编写一个自定义验证函数来解析text/plain有效负载。在路由配置的validate选项中使用此函数。

选择建议

最佳解决方案取决于具体情况。如果可能,建议使用application/json内容类型更新客户端应用程序。如果无法更新客户端,可以使用hapi-payload插件或自定义验证函数。

其他注意事项

  • 在某些情况下,Hapi可能无法正确解析application/json内容类型。在这种情况下,可以尝试使用Content-Type标头手动设置内容类型。
  • 还可以使用payloadType选项来覆盖Hapi用于解析有效负载的Content-Type标头。
  • 有关更多详细信息,请参考Hapi文档:https://hapi.dev/tutorials/payload

常见问题解答

1. 为什么在升级后出现这个问题?

升级后的Hapi和Joi改变了对请求有效负载的处理方式,现在需要手动解析text/plain有效负载。

2. 如何修复此问题?

可以通过修改客户端应用程序、使用hapi-payload插件或编写自定义验证函数来解决此问题。

3. 哪个解决方案最好?

最佳解决方案取决于具体情况。如果可能,建议更新客户端应用程序以使用application/json内容类型。

4. 是否可以手动解析text/plain有效负载?

可以,但建议使用hapi-payload插件或自定义验证函数,以简化此过程。

5. Hapi是否支持其他内容类型?

Hapi支持多种内容类型,包括application/jsontext/plainmultipart/form-data