node.js - Birden fazla promise döndürürken alt kısma yerleştirildiğinde Firestore belgeleri yazmaz


Firestore, dönüş ifadesini bu şekilde yerleştirirsen belgeler oluşturmaz:

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 })
])

Aşağıdaki kod Doc'u oluşturacak olsa da:

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'
  })
])

İlk formatı gerçek zamanlı veritabanı ile kullanıyorum ve mükemmel çalışıyor. Firestore'un neden en üstte olma ayrıcalığını istediğini bilmiyorum.

15 dakikadan fazla bekledim ve sayfayı yeniledim ama dokümanın hâlâ bir işareti yok.

Not: Projeyi yeniden başlattım ve yeni npm modüllerini de yükledim. Fayda etmedi XD

Tam kod, sorunun olmadığını düşündüğüm çünkü bu komutu en üste koyarsam belgenin oluşturulacağını düşünüyorum.

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 })                
  ]) 

})

GÜNCELLEME: Bu, Doug'un önerdiği şekilde işe yaradı.

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'
   })
 })      

Cevap #1

Sorunlar şunlardır:

  1. res.status(200).send() bir promise döndürmez, bu yüzden değerini Promise.all()'a geçirmek mantıklı değildir.
  2. res.status(200).send() ayrıca fonksiyonu hemen sonlandırır, bu da çalıştıktan sonra diğer asenkron kodların (Firestore güncellemeniz gibi) hiç çalışmasını beklememeniz gerektiği anlamına gelir.

Bunun yerine yapmanız gereken, Firestore güncellemesi tamamlanana kadar beklemektir (dönüş yaptığı promise'i kullanarak), ardından cevabı fonksiyonun en son şey olarak göndermektir.