#node.js #firebase #google-cloud-functions
#node.js #firebase #google-cloud-функции
Вопрос:
Я отправляю post-запрос облачной функции, которая содержит следующее тело:
{message: "this is the message"}
Если я пытаюсь напечатать все тело запроса, оно показывает его, но если я пытаюсь получить message
поле, я получаю undefined
в консоли.
Вот моя функция:
exports.myCloudFunction = functions.https.onRequest((req: any, res: any) => {
console.log(req.body)\prints the body of the request fine
console.log(req.body.message)\prints "undefined"
cors(req, res, () => {
const pl = req.body.message;
console.log(pl);\prints "undefined"
});
return res.send("all done")
});
Ответ №1:
Вам не нужен анализатор тела для облачных функций, как описано в другом ответе здесь. Облачные функции автоматически проанализируют JSON и поместят проанализированный объект JSON в body
атрибут. Если вы хотите, чтобы это произошло автоматически, вам следует установить тип содержимого запроса на «application / json», как описано в связанной документации. Затем вы можете использовать req.body
так, как и следовало ожидать.
Ответ №2:
Лично я раньше не работал с firebase, но из вашего кода и того факта, что req.body
печатается тело, кажется, что вам, вероятно, нужно проанализировать тело запроса как json, чтобы иметь возможность получить доступ к message
свойству:
const body = JSON.parse(req.body);
console.log(body.message);
Также может случиться так, что вам потребуется настроить bodyparser для json
содержимого. В обычном express-приложении вы можете сделать это с помощью (обратите внимание, что вам больше не нужен ручной синтаксический анализ сверху с помощью bodyparser):
const bodyParser = require('body-parser');
app.use(bodyParser.json();
Редактировать:
смотрите ответ Doug о правильном способе сделать это, т. Е. исправить ваш запрос и установить content-type равным application/json
, чтобы облачные функции автоматически анализировали и заполняли req.body
тело запроса.
Комментарии:
1. Добавление кода в ваш первый блок приводит к следующему: UnhandledPromiseRejectionWarning: SyntaxError: Неожиданный токен m в JSON в позиции 2 > в JSON.parse (<анонимный>) Я не уверен, как использовать объект bodyParser. Должен ли я заменить JSON.parse (req.body) на JSON.bodyParser (req.body)?
2. Можете ли вы попробовать отправить действительный json с кавычками, т.Е.:
{"message": "this is the message"}
?3. Я пробовал оба способа. Это то, что вы получаете без кавычек: SyntaxError: неожиданный токен ‘ в JSON в позиции 11 > в JSON.parse (<анонимный>)
4. Хииии! это работает, с кавычками.. но вы должны использовать двойные кавычки с обеих сторон..
5. В облачных функциях нет необходимости в анализаторе тела. Единственное, что вам нужно, это установить в запросе тип контента application / json, и облачные функции будут проанализированы автоматически.
Ответ №3:
Вам нужно просто преобразовать тело запроса в объект JSON в облачной функции.
const body = JSON.parse(req.body);
// message
console.log(body.message)