Просто в дополнение к ответу Джоан Грау:
Если вы добавите этот фильтр, вы можете быть уверены, что результат будет правильно проанализирован:
var bodyParser = require('body-parser');
var rawBodySaver = function (req, res, buf, encoding) {
if (buf && buf.length) {
req.rawBody = buf.toString(encoding || 'utf8');
}
}
app.use(bodyParser.json({ verify: rawBodySaver }));
app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
app.use(bodyParser.raw({ verify: rawBodySaver, type: function () { return true } }));
(идея взята из этого поста )
В частности, хорошей практикой является применение парсера только там, где он вам нужен. И, кроме того, рассмотрите возможность отправки в основной текст в виде строки base64 (это необходимо для работы в облачных задачах). Переписав свой код со всеми этими словами:
const task = {
appEngineHttpRequest: {
httpMethod: 'POST',
relativeUri: '/log_payload',
headers: myMap,
body: Buffer.from(JSON.stringify(options)).toString('base64')
},
};
и конечная точка:
var bodyParser = require('body-parser');
var rawBodySaver = function (req, res, buf, encoding) {
if (buf && buf.length) {
req.rawBody = buf.toString(encoding || 'utf8');
}
}
app.use('/log_payload', bodyParser.json({ verify: rawBodySaver }));
app.use('/log_payload', bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
app.use('/log_payload', bodyParser.raw({ verify: rawBodySaver, type: function () { return true } }));
app.post('/log_payload', async (req, res) => {
let mailOptions = {
subject: 'Message Delivered',
from: 'sender@example.com',
to: "receiver@example.com",
text: req.body //no need to parse here!
};
return await mailer.sendEmail(mailOptions).then(value => {
return res.send(`Received task payload: ${value}`).end()
}).catch(reason => {
res.send(`Worker error: ${reason.message}`).end()
});
});