node.js - Firestore skriver inte dokument om de placeras längst ner medan flera löften returneras
Firestore kommer inte att skapa dokument om returuttalandet placeras så här:
return Promise.all([
res.status(200).send({
method: 'sendMessage',
chat_id,
text: `${field1Val}`,
parse_mode: 'HTML'
}),
admin.firestore().collection('colName').doc(`docName`).set({ "field1": field1Val }, { merge: true })
])
Även om koden nedan kommer att skapa dokumentet:
return Promise.all([
admin.firestore().collection('colName').doc(`docName`).set({ "field1": field1Val }, { merge: true }),
res.status(200).send({
method: 'sendMessage',
chat_id,
text: `${field1Val}`,
parse_mode: 'HTML'
})
])
Jag använder det första formatet med Realtimedatabas och det fungerar perfekt. Jag förstår inte varför Firestore vill ha privilegiet att vara högst upp.
Jag har väntat i över 15 minuter och uppdaterat sidan, men fortfarande inget tecken på dokumentet.
PS: Jag hade återinitialiserat projektet och installerat nya npm-moduler också. Hjälpte inte XD
Den kompletta koden som jag inte tror är ett problem eftersom dokumentet skapas om jag placerar det kommandot högst upp.
import * as functions from 'firebase-functions';
import * as express from 'express'
import * as cors from 'cors'
import admin = require('firebase-admin');
admin.initializeApp();
const bot = express()
bot.use(cors({ origin: true }))
bot.post('/', async (req, res) => {
const commandSliced: string = JSON.stringify(req.body.message.text)
let userMsg: string = ''
if (commandSliced.startsWith(`!text`)) {
userMsg = userCommandSliced.replace('!text', '')
let exclmCmd_array: string[];
msg_array = userEMsg.split(/\b\s+/, 2)
const field1val= userMsg.replace(msg_array[0], '')
return Promise.all([
res.status(200).send({
method: 'sendMessage',
chat_id,
text: `${field1val}`,
parse_mode: 'HTML'
}),
admin.firestore().collection('colName').doc(`docName`).set({ "field1": field1Val }, { merge: true })
])
})
REDIGERA: Detta fungerade som föreslaget av Doug.
return admin.firestore().collection('colName').doc(`docName`).set({ "field1": field1Val }, { merge: true }).then(() => {
return res.status(200).send({
method: 'sendMessage',
chat_id,
text: `${field1Val}`,
parse_mode: 'HTML'
})
})
Svar #1
Problemen är att:
res.status(200).send()returnerar inte ett löfte, så det är meningslöst att skicka dess värde till Promise.all().res.status(200).send()avslutar också funktionen omedelbart, vilket betyder att efter att den har körts bör du inte förvänta dig att annan asynkron kod (som din Firestore-uppdatering) fungerar alls.
Det du istället bör göra är att vänta tills Firestore-uppdateringen är klar (genom att använda det löfte den returnerar), och sedan skicka svaret som det allra sista i funktionen.