json - 使用 Node.js Express 检查 POST 正文请求语法和格式
问题描述
我想简单地检查我的服务器在名为 '/route' 的路由上获取的 POST 请求正文的语法:
- 检查正文的格式是否实际上是 JSON,
- 检查正文的语法是否正确(没有缺少括号或缺少引号)。
/// 我的代码 ///
app.use(express.json());
function isJsonString(str) {
try {
console.log('JSON Parsing function...');
JSON.parse(str);
}
catch (e) {
console.log("Error : " + e);
return false;
}
return true;
}
app.post('/route', function(req, res) {
var isJsonString_result = isJsonString(req.body);
console.log(isJsonString_result);
if(isJsonString_result === true){
console.log('OK continue');
res.status(200).send('ok');
}
else{
console.log('Wrong body format');
res.status(404).send('ko');
}
})
/// 结果 ///
以下是当我使用此 JSON 从 Postman 发送 POST 请求时得到的结果(使用标头“Content-Type”:“application/json”发送):
{
"key1": "value1",
"key2": "value2"
}
/// 邮递员结果 ///
高
/// 控制台日志 ///
JSON解析函数...
错误:SyntaxError:JSON 中位置 1 的意外标记 o false
错误的正文格式
=> 解释似乎是“JSON.parse”无法解析现有的 JSON...
所以第一个问题:我如何检查正文是否是正确的 JSON 格式?
并使用缺少引号的其他 JSON(始终与标头“Content-Type”:“application/json”一起发送):
{
"key1": "value1",
"key2: "value2"
}
/// 邮递员结果 ///
以“SyntaxError: Unexpected token v in JSON at position 32”开头的长“错误”消息
/// 控制台日志 ///
相同 :
SyntaxError:JSON.parse () 位置 32 处 JSON 中的意外标记 v
……
=> 不知道如何处理这个问题,如果有许多带有错误正文语法的 POST 请求,我的“日志”可能会增长得非常快。
你能帮我解决这两个问题吗?
谢谢 !
解决方案
问题是您在express.json()
尝试验证 JSON 数据的路由之前使用:
app.use(express.json());
这将尝试解析传入的 JSON 数据,并在无效时返回错误。这就是您的第二个请求失败的原因。
您的第一个使用有效 JSON 的请求失败的原因是req.body
它将包含JSON.parse()
; 就是express.json()
这样。所以它将是一个对象,而不是字符串,这就是您的检查失败的原因(因为JSON.parse
只能用于字符串或缓冲区)。
您可以使用一个选项verify
来express.json()
验证传入数据:
app.use(express.json({
verify : (req, res, buf, encoding) => {
try {
JSON.parse(buf);
} catch(e) {
res.status(404).send('ko');
throw Error('invalid JSON');
}
}
}));