为了账号安全,请及时绑定邮箱和手机立即绑定

Firestore 复制功能,仅复制 1 个文档

Firestore 复制功能,仅复制 1 个文档

扬帆大鱼 2021-10-21 14:01:27
我有 2 个具有相同结构的集合,我想将文档从一个复制到另一个。当我第一次运行它时,它会复制其中一个项目,如果我再运行它多次,它就不会再复制任何东西了。exports.copyDocs = functions.https.onRequest((request, response) => {    let terminalIdToCopy = `123`; // terminal to be copied    let terminalId = `456`; // terminal for the copies to be added    let docsToCopy = db.collection(`/terminal/${terminalIdToCopy}/folderA/`);    let docsNewDir = db.collection(`/terminal/${terminalId}/folderB/`);    docsToCopy.get().then(snapshot => {        let result = [];        snapshot.forEach(doc => {            result.push(doc.data());            let promise = docsNewDir.doc(doc.id).set(doc.data())        });        response.status(200).send(`Copied items: ${JSON.stringify(result)}. From terminal ${terminalIdToCopy} to terminal ${terminalId}`);    }).catch(error => {        response.status(500).send(`Error: ${error}`);    });});我也试过添加一个 .then (不打印日志消息):docsNewDir.doc(doc.id).set(doc.data())            .then( i => { console.log(`i (${i})`)}, i2 => { console.log(`i2: ${i2}`);})                .catch(error =>                console.log(`Could NOT copy doc with id ${doc.id}: ${error}`)            );而且我还尝试将所有承诺结合起来:docsToCopy.get().then(snapshot => {        let result = [];        let promises = [];        snapshot.forEach(doc => {            result.push(doc.data());            promises.push(docsNewDir.doc(doc.id).set(doc.data()));        });        Promise.all(promises).then(values => {console.log("all done")});  // this won't print        response.status(200).send(`Copied items: ${JSON.stringify(result)}. From terminal ${terminalIdToCopy} to terminal ${terminalId}`);    }).catch(error => {        response.status(500).send(`Error: ${error}`);    });在result包含了应被复制的文件。
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

您使用 Promise.all() 走在正确的轨道上,但您的最终解决方案仍然需要在所有承诺解决后才发送响应。您现在所拥有的仍然在任何事情完全解决之前发送响应,这会在它们完成之前终止该功能。你应该做更多这样的事情:


Promise.all(promises).then(values => {

    console.log("all done")

    response.status(200).send(`Copied items: ${JSON.stringify(result)}. From terminal ${terminalIdToCopy} to terminal ${terminalId}`);

});


查看完整回答
反对 回复 2021-10-21
  • 1 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信