首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用云函数将数据写入云Firestore

如何使用云函数将数据写入云Firestore
EN

Stack Overflow用户
提问于 2019-11-07 22:25:19
回答 2查看 1.1K关注 0票数 0

对于我在Flutter中构建的调度应用程序,我正在尝试使用云函数和cron作业将数据写入到我的云Firestore数据库中,以使我的应用程序更具自我维护性。我被困在第一步,试图让我的云函数将数据写入我的云Firestore数据库。

下面我在github上添加了图片的链接,这些图片展示了我当前的数据在Firestore中是如何构造的。我想要的是将命名文档添加到集合'days‘中,其中有更多带有字段'hour’和'reserved‘的命名文档。

图1:https://github.com/winckles/rooster/blob/master/Schermafbeelding%202019-11-07%20om%2014.27.55.png?raw=true

图2:https://github.com/winckles/rooster/blob/master/Schermafbeelding%202019-11-07%20om%2014.28.26.png?raw=true

下面我还包括了我在Firestore中获取数据的尝试。

代码语言:javascript
复制
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

// admin.firestore().collection('days').add({original: original}). then(writeResult => {
//
// });

exports.updateData = functions.https.onCall((data, context) => {
    const days = admin.firestore().collection('days');
    return days.doc(data['2019-11-08/hours/001']).set({
        hour: '08:00-09:00',
        reserved: '',
    });
});

理想情况下,我希望云函数添加14个文档(例如,2019-11-06至2019-11-19)。然后,这些文档都将有一个子集合‘hour’,其中包含来自第二个屏幕截图的数据(因此文档001、002、003等具有字段hour和reserved)。

我阅读了有关云函数的文档,发现大多数触发器都是在将数据写入Firestore时发现的,但这不是我想要的。我也尝试了快速入门函数示例,但没有成功。这应该不会太难,但我似乎搞不懂。我正在使用Javascript编写云函数。如有任何帮助或建议,我们将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-07 23:34:45

你并没有具体说明什么对你不起作用。然而,我注意到的第一件事是您没有从云函数上下文中正确地调用initilizeApp。对于云函数,您不需要任何参数,因为默认凭据应该对您有效(除非您已经做了一些非常不寻常的事情)。

这是一个云函数,它将模拟您想要的行为。它没有完成所有的行为,因为我发现编写日期处理代码可能会分散对问题的主要部分的注意力,即firestore和函数代码本身。

同样,这使用了https函数(因为它对我来说更容易测试:),要使用可调用函数(或任何其他函数类型,例如,如果您正在使用cron作业,则是计划函数),您将需要稍微调整它(例如,对于可调用函数,您需要将声明改回onCall,并更改最终的.then()调用以返回您想要返回的值)。

代码语言:javascript
复制
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

const db = admin.firestore();

exports.doIt = functions.https.onRequest((request, response) => {
    const days = db.collection('days');
    const writePromises = [];

    ['2019-11-08', '2019-11-09'].forEach((day) => {
      const documentReference = days.doc(day);
      writePromises.push(documentReference.set({reserved: ''}));

      const hoursReference = documentReference.collection('hours');
      const dataMap = { '001': '08:00-09:00',
                        '002': '09:00-10:00',
                        '003': '10:00-11:00',
                        '004': '11:00-12:00' };
      Object.keys(dataMap).forEach((hour) => {
        writePromises.push(hoursReference.doc(hour).set({
          hour: dataMap[hour],
          reserved: ''
        }))
      });
    });

    return Promise.all(writePromises)
      .then(() => { response.send('ok'); })
      .catch((err) => { console.log(err); });
  });

请注意,当您编写整个结构时,您将为写入每个文档而付费。然而,实际上没有办法避免这种情况,因为写入是按文档计费的,而不是按请求计费的。

同样,您可能希望考虑将其作为batched write来执行--上面的示例只是展示了编写的基本方法。批处理写入会自动将所有文档放入数据库中。然而,批量写入被限制为500个更新,您将命中大约21天的数据(21天* 24小时)。这看起来与上面的非常相似(下面是函数本身的内容:

代码语言:javascript
复制
    const days = db.collection('days');
    const batch = db.batch();

    ['2019-11-08', '2019-11-09'].forEach((day) => {
      const documentReference = days.doc(day);
      batch.set(documentReference, {reserved: ''});

      const hoursReference = documentReference.collection('hours');
      const dataMap = { '001': '08:00-09:00',
                        '002': '09:00-10:00',
                        '003': '10:00-11:00',
                        '004': '11:00-12:00' };
      Object.keys(dataMap).forEach((hour) => {
        batch.set(hoursReference.doc(hour), {
          hour: dataMap[hour],
          reserved: ''
        });
      });
    });

    return batch.commit()
      .then(() => { response.send('ok'); })
      .catch((err) => { console.log(err); });

我确实想知道为什么你需要在云函数中这样做,而不是直接从你的应用程序中通过Firestore调用。无论如何,以上内容应该可以让您开始使用。

票数 0
EN

Stack Overflow用户

发布于 2019-11-08 00:24:37

如果你想在firebase中使用cron,使用Google Cloud Scheduler可能会更好,但要小心,这种方法有不同的效果

代码语言:javascript
复制
    exports.scheduledFunction = functions.pubsub.schedule('every 5 minutes').onRun((context) => {
  console.log('This will be run every 5 minutes!');
  return null;
});

您可以在以下内容中了解更多信息:

https://firebase.google.com/docs/functions/schedule-functions

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58750818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档