Почтальон работает, но fetch () - нет. Почему бы и нет? - PullRequest
0 голосов
/ 19 января 2019

Запрос почтальона работает, но я не могу заставить fetch () работать с тем же запросом и заголовками.Это сводит меня с ума.

Клиент:

fetch('http://localhost:1234/acts/create', {
    method: 'POST',
    headers: {
        "Content-Type": "application/x-www-form-urlencoded",
    },
    body: JSON.stringify({
        name: 'BARNEY MCGREW!',
        rating: 90,
    })
})

Экспресс:

exports.act_create = function (req, res) {
    console.log(' req >>>>', req.body);
    var act = new Act(
        {
            name: req.body.name,
            rating: req.body.rating
        }
    );

    // res.set('Content-Type', 'application/x-www-form-urlencoded');

    act.save(function (err) {
        if (err) {
            return console.log(err);
        }
        res.send('Act Created successfully')
    })
};

Это генерирует следующий вывод терминала:

 req >>>> :  [Object: null prototype] { '{"name":"IngleburtHumperdink","rating":10}': '' }
act is:  { _id: 5c4245bea7bb511c20de6b7a }

Такэто вроде как проходит, но потом я получаю ValidationError: Act validation failed: name: Path name is required., rating: Path "rating" is required.

То же самое для пути "name".

Так что, очевидно, изо всех сил пытается сопоставить строковый объект json с именем / рейтингомзначение приходит. Но удаление JSON.stringify из тела запроса POST дает мне req >>>> [Object: null prototype] { '[object Object]': '' }

Что я здесь не так делаю?

[иЕсть ли хорошие блоги, в которых четко объясняется, как передавать данные через тело, чтобы они были доступны через fetch() без проблем?]

1 Ответ

0 голосов
/ 19 января 2019

Тело запроса x-www-form-urlencoded должно быть name=BARNEY%20MCGREW%21&rating=90.

Вы отправляете запрос по fetch с телом '{"name":"BARNEY MCGREW!","rating":90}'.

Поскольку = отсутствует, вся строка JSON считается именем параметра с пустым значением.

Итак, вам дан объект из req.body, где в качестве ключа выступает строковый JSON.


Создайте URLSearchParams, передав ваши данные конструктору - замените JSON.stringify.

fetch('http://localhost:1234/acts/create', {
    method: 'POST',
    headers: {
        "Content-Type": "application/x-www-form-urlencoded",
    },
    body: new URLSearchParams({
        name: 'BARNEY MCGREW!',
        rating: 90,
    })
})

Ваше тело запроса fetch теперь должно быть name=BARNEY%20MCGREW%21&rating=90.

Это будет правильно проанализировано анализатором тела как x-www-form-urlencoded content.


Если URLSearchParams не определено, существуют пакеты npm, которые его предоставят. В противном случае все, что он делает, это создает строку параметров URL, кодируя и объединяя ключи и значения с помощью = и соединяя каждую пару с помощью &, что можно сделать так:

function URLSearchParams(data) {
    return Object.keys(data).map(key => {
        return `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`;
    }).join('&');
}
...