Доступ к отдельным полям из тела запроса внутри облачной функции

#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)