Firestore не будет писать документы, если поместить их внизу, при этом возвращая несколько обещаний - PullRequest
2 голосов
/ 29 мая 2020

Firestore не будет создавать документы, если поместить оператор return следующим образом:

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

Хотя приведенный ниже код создаст Do c:

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

Я использую первый формат с базой данных в реальном времени, и он отлично работает. Я не знаю, почему Firestore хочет быть на вершине.

Я ждал 15+ минут и обновил страницу, все еще без признаков документа.

PS: Я повторно инициализировал проект и установил новые модули npm. Не помогло XD

Полный код, который я не считаю проблемой, потому что do c создается, если я поместил эту команду вверху.

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

})

РЕДАКТИРОВАТЬ: Это сработало, как было предложено Дугом.

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

1 Ответ

1 голос
/ 29 мая 2020

Проблемы заключаются в следующем:

  1. res.status(200).send() не возвращает обещание, поэтому нет смысла передавать его значение в Promise.all ().
  2. res.status(200).send() также немедленно завершает функцию , что означает, что после ее выполнения вам не следует ожидать, что другой асинхронный код (например, обновление Firestore) вообще будет работать.

Вместо этого вам следует дождаться завершения обновления Firestore (используя обещание, которое оно возвращает), а затем отправить ответ как самое последнее в функции.

...