使用Node.js Express

时间:2018-08-31 09:17:35

标签: 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的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请求的主体语法错误,我的“日志”可能会非常快地增长。

您能帮我解决两个问题吗?

谢谢!

2 个答案:

答案 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对象