Firestore在返回多个承诺时放在最下面时不会写文档

问题描述 投票:2回答:1

如果放置这样的return语句,Firestore将不会创建文档:

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 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没有帮助

完整的代码,如果我将命令放在顶部,我认为这不是问题,因为会创建文档。

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'
   })
 })      
node.js typescript firebase google-cloud-firestore
1个回答
1
投票

问题是:

  1. [res.status(200).send()不返回承诺,因此将其值传递给Promise.all()。]
  2. [res.status(200).send()也是terminates the function immediately,这意味着在执行之后,您完全不应该期望其他异步代码(例如Firestore更新)正常工作。
  3. 您应该做的是等到Firestore更新完成(通过使用它返回的Promise,然后将响应作为函数中的最后一件事发送。

© www.soinside.com 2019 - 2024. All rights reserved.