使用 Node.js Express 检查 POST 主体请求语法和格式

Fra*_*kie 5 post json node.js express

我想简单地检查我的服务器在名为 '/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');
    }
})
Run Code Online (Sandbox Code Playgroud)

/// 结果 ///

以下是我使用此 JSON 从 Postman 发送 POST 请求时得到的结果(使用标头“Content-Type”:“application/json”发送):

{
  "key1": "value1",
  "key2": "value2"
}
Run Code Online (Sandbox Code Playgroud)

/// 邮递员结果 ///

/// 控制台日志 ///

JSON 解析函数...

错误:SyntaxError:JSON 中的意外标记 o 在位置 1 false

错误的正文格式

=> 解释似乎是“JSON.parse”无法解析现有的 JSON...

所以第一个问题:我如何检查正文是否是正确的 JSON 格式?

并使用其他缺少引号的 JSON(始终与标题“Content-Type”:“application/json”一起发送):

{
  "key1": "value1",
  "key2: "value2"
}
Run Code Online (Sandbox Code Playgroud)

/// 邮递员结果 ///

以“SyntaxError: Unexpected token v in JSON at position 32”开头的长“错误”消息

/// 控制台日志 ///

相同 :

SyntaxError: Unexpected token v in JSON at position 32 at JSON.parse ()

……

=> 不知道如何处理这个问题,如果有许多具有错误正文语法的 POST 请求,我的“日志”可能会增长得非常快。

你能帮我解答这两个问题吗?

谢谢 !

rob*_*lep 5

问题是您在express.json()尝试验证 JSON 数据的路由之前使用:

app.use(express.json());
Run Code Online (Sandbox Code Playgroud)

这将尝试解析传入的 JSON 数据,并在无效时返回错误。这就是您的第二个请求失败的原因。

您使用有效 JSON 的第一个请求失败的原因是req.body它将包含以下结果JSON.parse();就是express.json()这样。所以它将是一个对象,而不是一个字符串,这就是为什么你的检查失败(因为JSON.parse只能用于字符串或缓冲区)。

有一个选项verifyexpress.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');
    }
  }
}));
Run Code Online (Sandbox Code Playgroud)