Firebase调度功能在第一次调度后失败

雕刻师

这是我的职责 只需每5分钟从API请求一次天气报告,然后将数据写入Firestore集合/文档中:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const fetch = require('node-fetch');
admin.initializeApp();
const db = admin.firestore();

const cors = require("cors")({ origin: true });

exports.getWeather = functions
    .region('europe-west2')
    .pubsub.schedule('every 5 minutes').onRun((context) => {

        const weatherApiKey = '**************************';
        const weatherLocation = {
            'Winchelsea Beach': '354689',
            'Rye': '310224',
            'Hastings': '310087'
        };
        const weatherApiUrl = 'http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/json/' + weatherLocation["Winchelsea Beach"] + '?res=3hourly&key=' + weatherApiKey;

        fetch(weatherApiUrl)
            .then(res => res.json())
            .then(json => {
                db.collection("weather").doc("forecast").set({
                    data: json,
                    updatedLast: new Date().getTime()
                });
            });
});

该函数在第一次运行时就成功地将数据添加到了数据库中,但是并不是每5分钟运行一次,实际上它已经完全停止了,并且它说我的日志中有错误。

这是我的日志中显示的内容:

在此处输入图片说明

此后没有更多的日志了,应该每5分钟记录一次日志。如果我重新部署,它将再次运行并显示日志,然后停止。

我还检查了Cloud Scheduler,它显示Result: Failed

在此处输入图片说明

我有个想法,计划的函数不会再出现错误,但是我不知道我的函数出了什么问题Function return undefined, expected Promise or value

我该如何解决?

道格·史蒂文森

该错误消息告诉您,您的函数应返回一个承诺,该承诺将在所有异步工作完成后解决。如果您不这样做,那么该功能将提前终止,并且异步工作极不可能完成,因为Cloud Functions随后会关闭。

建议阅读文档以更好地了解其工作原理。

解决方案非常简单。通过正确链接承诺,返回在获取和Firestore写入完全完成后解析的承诺。

        return fetch(weatherApiUrl)
            .then(res => res.json())
            .then(json => {
                return db.collection("weather").doc("forecast").set({
                    data: json,
                    updatedLast: new Date().getTime()
                });
            });

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章