Firebase 管理 SDK 不适用于 Cloud Scheduler (PubSub)

马哈茂德·纳菲

我有一个应用程序,我想每 5 分钟更新一次天气详细信息。在 Google 云函数构建了一个PubSub 函数,以从weatherstack.com网站获取天气详细信息,然后我尝试使用Admin SDK将结果保存在 FireStore 上天气 API 工作正常,但未触发将数据写入 FireStore 的功能。

我的代码:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const requestApi = require('request');

admin.initializeApp();

exports.WeatherPubSub = (event, context) => {

    requestApi({
        url: 'http://api.weatherstack.com/current?access_key=XXXXXXXXXXXXXXXXXXXX&query=XXXXX',
        method: "POST"
    }, (error, response, body) => {
        //console.log(JSON.parse(body));
        if (error) {
            console.log('error:', error); // Print the error if one occurred
        } else {
            console.log("=> "+ response.statusCode);
            //Call firestore to update weather data
            return admin.firestore().collection('settings').doc('weather').update({
                temperature: body.current['temperature'],
                humidity: body.current['humidity'],
                weather_descriptions: body.current['weather_descriptions'][0]
            }).then(function() {
                console.log('Done!');
            });
        }

    });

  //return null;
};

包.json

{
  "name": "functions",
  "version": "0.0.2",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "serve": "firebase serve --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "8"
  },
  "dependencies": {
    "@google-cloud/pubsub": "^1.5.0",
    "firebase-admin": "^8.9.2",
    "firebase-functions": "^3.3.0",
    "request": "^2.88.2"
  },
  "devDependencies": {
    "firebase-functions-test": "^0.1.6"
  },
  "private": true
}

雷诺塔内克

您必须返回一个承诺,当您的 Cloud Function 中的所有异步工作完成时(即调用weatherstackAPI 和 Firestoreupdate()方法)。

此处的Firebase 官方视频系列对此进行了解释特别是观看标题为“Learn JavaScript Promises”的三个视频(第 2 部分和第 3 部分特别关注后台触发的云函数,但之前的第 1 部分确实值得一看)。


request您使用库本身支持回调接口,但不返回 promise

您可以使用request-promise库和rp()“返回常规 Promises/A+ 兼容承诺”的方法,然后按如下方式调整您的代码:

 //.....
 var options = {
        method: 'POST',
        uri: 'http://api.weatherstack.com/current?access_key=XXXXXXXXXXXXXXXXXXXX&query=XXXXX'
 };

return rp(options)
.then(body => {
       return admin.firestore().collection('settings').doc('weather').update({
                temperature: body.current['temperature'],
                humidity: body.current['humidity'],
                weather_descriptions: body.current['weather_descriptions'][0]
            }
})
.catch(err => {
    console.log(err);
    return null;  
});
 //.....

此外,您应该仔细检查您声明 cloud Function ( exports.WeatherPubSub = (event, context) => {...}) 的方式是否正确。似乎并非如此,有关更多详细信息,请参阅文档

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

适用于 .NET list() 函数的 Azure 管理库 SDK 不适用于各种接口

在sdk管理器中找不到适用于Android库的Google Cloud Messaging

Firebase:“错误:9 FAILED_PRECONDITION:Cloud Firestore API不适用于Cloud Datastore项目”

使用Firebase Admin SDK(NodeJS)将数据导入Firestore不适用于所有集合

Firebase Cloud Messaging-PHP Rest API不适用于iOS

Java VDM生成器不适用于SAP Cloud SDK 3.7.0版的API_SALES_ORDER_SIMULATION_SRV

通过SAP Cloud SDK VDM在业务合作伙伴上进行深度插入不适用于to_Customer

本地Pubsub仿真器不适用于Dataflow

Firebase 管理 SDK - Python

RTCMulticonnection不适用于Firebase

Firebase Cloud pubsub订阅停止监听消息

适用于Android的Firebase Admin SDK,找不到方法

适用于Firebase的Cloud Functions中的本地依赖关系

依赖管理不适用于多模块项目

版本管理不适用于Windows 8.1凭据

电源管理不适用于Realtek wifi卡

我的style.css适用于前端,但不适用于管理区域

无法在Cloud Functions中初始化Firebase管理员SDK

Laravel:Telegram SDK不适用于Laravel 5.5

AWS php sdk不适用于PHP 7

Spring Cloud Contract测试适用于Maven,但不适用于JUnit

Spring-cloud-contract测试不适用于JAXRSCLIENT

Spring Cloud Contract 不适用于 Surefire 2.20

Wolfram Cloud 不适用于任何浏览器

Cloud Firestore不适用于iOS 扑

重定向不适用于 Cloud SQL

使用Firebase的Laravel FCM推送通知不适用于iOS,但适用于Android

Firebase 登录不适用于较低的 android 版本

Express会话不适用于Firebase托管