Когда я пытаюсь опубликовать данные с почтальоном в firebase, я получаю эту ошибку: Ошибка: значение аргумента «данные» не является допустимым документом Firestore. Нельзя использовать «undefined» в качестве значения Firestore (найдено в теле поля).
Я проверил, и тело, и userHandle возвращаются как неопределенные, но я не знаю, почему. С почтальоном я использую POST и в теле отправляю json следующим образом:
{
"body": "scream 2",
"userHandle": "user2"
}
как необработанный JSON (приложение/json)
const functions = require('firebase-functions');
const admin = require('firebase-admin');
let firebaseConfig = {
apiKey: '*******',
authDomain: '******',
databaseURL: '*****',
projectId: '*****',
storageBucket: '****',
messagingSenderId: '*****',
appId: '*******'
};
admin.initializeApp(firebaseConfig);
exports.createScream = functions.https.onRequest((req, res) => {
if (req.method !== 'POST') {
return res.status(400).json({ error: 'Method not allowed' });
}
const newScream = {
body: req.body.body,
userHandle: req.body.userHandle,
createdAt: admin.firestore.Timestamp.fromDate(new Date())
};
admin
.firestore()
.collection('screams')
.add(newScream)
.then(doc => {
res.json({ message: `document ${doc.id} created successfully` });
})
.catch(err => {
res.status(500).json({ error: 'something went wrong' });
console.error(err);
});
});
{ "body": "scream", "userHandle": "user2" } И я попытался использовать экспресс + body-parser, но получил ту же ошибку.
Время идеи... хотя я сомневаюсь, что это исправит - но я рекомендую вам следовать лучшие практики, чтобы гарантировать, что у вашей облачной функции достаточно времени для работы, вернув свое обещание... что означает return admin.firestore().colle....etc... Никогда не знаешь, может быть, облачная функция завершает работу до того, как закончит "добавление" новой записи... и поэтому, когда делает наконец "добавит" новую запись, цикл запроса/ответа уже закончился... и req.body теперь пуст.





В сообщении об ошибке говорится, что одно из полей, которые вы добавляете в документ Firestore, не определено:
const newScream = {
body: req.body.body,
userHandle: req.body.userHandle,
createdAt: admin.firestore.Timestamp.fromDate(new Date())
};
Поскольку вы показываете все переменные, значения которых мы не можем видеть, мы не можем сказать, какая из них может быть неопределенной. Вам придется отладить это самостоятельно, чтобы выяснить, какой из них не определен, и изменить свой код, чтобы проверить правильность входных данных.
Я уже говорил, что body и userHandle возвращаются как undefined, но я не знаю почему. Входные данные должны быть действительными.
Когда я использую жестко закодированные данные в функции .add(), это работает, но с почтальоном это не так.
Хорошо, это немного странно, но в почтальоне тело было настроено на необработанный JSON (application/json), но я снова установил его на JSON (application/json), и теперь он работает.
По моему опыту:
Многие люди при использовании postman забывают изменить тело на JSON (по умолчанию это текст). Посмотрите на картинку ниже:
Итак, если вы увидите в правом конце, вы найдете JSON, выделенный оранжевым цветом. Это должно быть установлено в JSON (если вы пытаетесь нажать JSON, конечно). По умолчанию я обнаружил, что это в тексте.
Остальное о коде, который вы разместили в вопросе, на должном уровне.
Я действительно думал, что это может помочь кому-то, кто сталкивается с подобной проблемой, поэтому решил упомянуть об этом.
Удачного кодирования.
Привет, Вилмос, и добро пожаловать в StackOverflow! Я не замечаю ничего, что вы явно делаете неправильно... можете ли вы включить
console.info(req.body)в качестве первой строки вашей функции, а затем проверьте журналы функций, чтобы увидеть, что происходит как все тело?