首页 > 解决方案 > 使用 Node.js Express 检查 POST 正文请求语法和格式

问题描述

我想简单地检查我的服务器在名为 '/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 从 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 请求,我的“日志”可能会增长得非常快。

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

谢谢 !

标签: jsonnode.jsexpresspost

解决方案


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

app.use(express.json());

这将尝试解析传入的 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');
    }
  }
}));

推荐阅读