如果放置这样的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'
})
})
问题是:
res.status(200).send()
不返回承诺,因此将其值传递给Promise.all()。]res.status(200).send()
也是terminates the function immediately,这意味着在执行之后,您完全不应该期望其他异步代码(例如Firestore更新)正常工作。您应该做的是等到Firestore更新完成(通过使用它返回的Promise,然后将响应作为函数中的最后一件事发送。