Проверьте, являются ли данные экспресс-запроса массивом

Я работаю над сервером API Express 3.x (не спрашивайте, почему я не обновляюсь до 4.x; я не контролирую это), и я пытаюсь реализовать поддержку пакетных запросов для конкретная конечная точка. В настоящее время конечная точка поддерживает обычные запросы (принимает объект JSON), но я хочу, чтобы она также могла принимать массив объектов JSON, например:

POST /api/posts
Body:
[
  { "title": "Hello World", "text": "blah blah" },
  { "title": "Hello World 2", "text": "blah blah blah" }
]

Когда я пытаюсь получить доступ к телу запроса для одного запроса, используя req.body, я могу получить данные просто отлично (это просто обычный объект JSON). Однако, когда я отправляю массив, я обнаруживаю, что данные анализируются как объект объектов (?), а не как массив.

req.body = { "title": "Hello World", "text": "blah blah" };
typeof req.body;
// object
req.body.toString();
// [object Object]

req.body = [
  { "title": "Hello World", "text": "blah blah" },
  { "title": "Hello World 2", "text": "blah blah blah" }
];
typeof req.body;
// object
req.body.toString();
// [object Object],[object Object]

Я попытался использовать простую проверку следующим образом:

if (req.body.toString() !== '[object Object]') {

Но массив, содержащий только один объект, нарушает это. Например.:

req.body = [{ "title": "Hello World", "text": "blah blah" }];
typeof req.body;
// object
req.body.toString();
// [object Object]

Учитывая это, есть ли гарантированный способ проверить, являются ли мои данные массивом?


person southrop    schedule 05.01.2015    source источник
comment
если (req.body экземпляр массива) {}   -  person Cory Danielson    schedule 05.01.2015
comment
Массив.isArray(req.body); также возвращает истину   -  person Cory Danielson    schedule 05.01.2015
comment
Блин, почему я не подумал об этом... Большое спасибо, @CoryDanielson! Если вы сможете превратить свои комментарии в ответ, я приму его!   -  person southrop    schedule 05.01.2015


Ответы (1)


Типичный способ сделать это в любой среде JavaScript:

if ( req.body instanceof Array ) {
    // do stuff
}

Но поскольку у вас есть роскошь запуска JavaScript внутри V8, вы также можете используйте следующее без каких-либо проблем:

if ( Array.isArray(req.body) ) {
    // do stuff
}

Просто личное предпочтение, которое вы используете.

person Cory Danielson    schedule 05.01.2015
comment
Оба решения сработали для меня, но я думаю, что лучшее решение более читабельно. Кто-нибудь знает, есть ли преимущества в производительности от использования одного над другим? - person deanshanahan; 11.12.2017
comment
Нет, определенно нет существенной разницы в производительности между ними. Если вы не делаете что-то вроде запуска этого кода в цикле миллион раз, вы не заметите разницы. - person Cory Danielson; 11.12.2017