Hapi和Joi升级后请求验证失败?可能是处理请求有效负载方式变了
2024-03-10 09:25:13
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/json
、text/plain
和multipart/form-data
。