我想简单地检查服务器在名为“ / route”的路由上获得的POST请求正文的语法:
///我的代码///
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的POST请求时获得的结果(发送的标题为“ Content-Type”:“ application / json”):
{
"key1": "value1",
"key2": "value2"
}
///邮递员结果///
ko
/// Console.log ///
JSON解析功能...
错误:语法错误:JSON中位置1处的意外令牌o错误
错误的身体格式
=>解释似乎是“ JSON.parse”无法解析现有的JSON ...
第一个问题:请问如何检查正文是否为正确的JSON格式?
以及其他带有引号缺失的JSON(始终以标头“ Content-Type”:“ application / json”发送):
{
"key1": "value1",
"key2: "value2"
}
///邮递员结果///
以“ SyntaxError:JSON中位置32处的意外令牌v”开头的长“错误”消息
/// Console.log ///
一样:
SyntaxError:JSON中意外的令牌v在JSON.parse的位置32 ()
... ...
=>不知道如何处理此问题,如果有很多POST请求的主体语法错误,我的“日志”可能会非常快地增长。
您能帮我解决两个问题吗?
谢谢!
答案 0 :(得分:0)
问题是您在尝试验证JSON数据的路由之前使用express.json()
:
app.use(express.json());
这将尝试解析传入的JSON数据,并在无效时返回错误。这就是第二个请求失败的原因。
使用有效JSON的第一个请求失败的原因是req.body
将包含JSON.parse()
的结果; express.json()
就是这样做的。因此它将是一个对象,而不是字符串,这就是检查失败的原因(因为JSON.parse
仅可用于字符串或缓冲区)。
express.json()
有一个选项verify
,可用于验证传入的数据:
app.use(express.json({
verify : (req, res, buf, encoding) => {
try {
JSON.parse(buf);
} catch(e) {
res.status(404).send('ko');
throw Error('invalid JSON');
}
}
}));
答案 1 :(得分:0)
由于尝试将 json对象解析为 json对象而遇到错误,JSON.parse()
用于将json字符串解析为 json对象
例如
JSON.parse('{ "name":"John", "age":30, "city":"New York"}');
在您的情况下,您不需要检查它是否为json字符串,因为您使用app.use(express.json());
,它将检查传入的主体是否正确json格式,如果不是,它将忽略它。
因此,基本上,您只会从req.body
中获得安全的json对象