Проверьте синтаксис и формат запроса тела POST с помощью Node.js Express - PullRequest
0 голосов
/ 31 августа 2018

Я хотел бы просто проверить синтаксис тела запроса POST, который мой сервер получает по маршруту '/ route':

  • проверить, является ли формат тела 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');
    }
})

/// Результаты ///

Вот результаты, которые я получаю, когда отправляю POST-запрос от Postman с этим JSON (отправляется с заголовком «Content-Type»: «application / json»):

{
  "key1": "value1",
  "key2": "value2"
}

/// Результат почтальона ///

Ко

/// Console.log ///

Функция синтаксического анализа JSON ...

Ошибка: SyntaxError: неожиданный токен o в JSON в позиции 1 false

Неправильный формат тела

=> объяснение, по-видимому, в том, что "JSON.parse" не может проанализировать существующий JSON ...

Итак, первый вопрос: как проверить правильность тела в формате JSON?

и с этим другим JSON с пропущенными кавычками (всегда отправляется с заголовком «Content-Type»: «application / json»):

{
  "key1": "value1",
  "key2: "value2"
}

/// Результат почтальона ///

Длинное сообщение об ошибке, начинающееся с "SyntaxError: Неожиданный токен v в JSON в позиции 32"

/// Console.log ///

То же самое:

SyntaxError: неожиданный токен v в JSON в позиции 32 в JSON.parse ()

... ...

=> Не знаю, как решить эту проблему, если много запросов POST с неправильным синтаксисом тела, мой «журнал» потенциально может очень быстро расти.

Не могли бы вы помочь мне с обоими вопросами?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вы получили ошибку, потому что пытаетесь проанализировать объект json в объект json , JSON.parse() используется для анализа строки json в объект json

например. JSON.parse('{ "name":"John", "age":30, "city":"New York"}');

в вашем случае вам не нужно проверять, является ли она строкой json или нет, так как вы используете app.use(express.json());, она проверит, является ли входящее тело правильным форматом json или нет, если нет, то проигнорирует его.

так что в основном вы получите безопасный объект json только от вашего req.body

0 голосов
/ 31 августа 2018

Проблема в том, что вы используете 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');
    }
  }
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...