【问题标题】:Firebase Functions work in firebase deployment, but not locallyFirebase 函数在 firebase 部署中工作,但在本地不工作
【发布时间】:2020-01-07 17:34:39
【问题描述】:

此代码不会在 localhost 中返回任何数据,但在部署到 firebase 时效果很好。有什么建议? (尝试使用“firebase emulators:start”和“npm run serve”)。 我应该得到一个包含课程的 json 对象。
我尝试使用 try/catch 没有任何结果:

  • 'npm run server'(“npm run build && firebase serve --only 函数”)

错误:无法加载默认凭据。错误:未处理 不推荐使用承诺拒绝。未来,承诺 未处理的拒绝将终止 Node.js 进程 非零退出代码。 UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误 起源于在没有捕获的情况下抛出异步函数内部 阻止,或拒绝未使用 .catch() 处理的承诺

  • 'firebase emulators:start' -> 没有错误,但 json 为空:{"courses":[]}

代码链接:https://github.com/angular-university/firebase-course/blob/1-firebase-finished/functions/src/index.ts

  import * as functions from 'firebase-functions';
    import {db} from './init';
    import * as express from "express";
    const cors = require('cors');
    const app = express();
    app.use(cors({origin:true}));

    app.get('/courses', async (request, response) => {
        const snaps = await db.collection('courses').get();
        const courses:any[] = [];
        snaps.forEach(snap => courses.push(snap.data()));
        response.status(200).json({courses});
    });

    export const getCourses = functions.https.onRequest(app);

_____________________________________________________________________________

    init.ts

    const admin = require('firebase-admin');
    admin.initializeApp();
    export const db = admin.firestore();

app.get('/courses', async (request, response) => {
    try {
        const snaps = await db.collection('courses').get();
        const courses:any[] = [];
        snaps.forEach((snap: any) => courses.push(snap.data()));
        response.status(200).json({courses});
    } 
    catch(err) {
        console.error(err) 
    }
});
export const getCourses = functions.https.onRequest(app);

【问题讨论】:

  • 您到底在做什么,并观察到与您预期的不同?请编辑问题并具体说明,以便任何人都可以重现您的体验。
  • 当然,我提供了更多信息。感谢您的建议。
  • 错误消息显示“此错误源于在没有 catch 块的情况下抛出异步函数内部”。是否需要通过 try/catch 来确定数据库操作是否失败?
  • 我尝试使用 try/catch 没有任何结果。还有其他方法可以尝试/捕获吗?

标签: node.js typescript firebase google-cloud-functions


【解决方案1】:

您需要提供权限凭据。它适用于谷歌云,因为有环境变量可以自动完成。


您需要使用凭据文件的路径在本地设置此环境变量。在你的终端试试这个:

export FIREBASE_CONFIG="/user/path/to/credential.json"

More info


尝试关注documentation。它提供了如何做到这一点的好例子。

【讨论】:

  • Cloud Functions 提供的默认服务帐户(在不带参数的情况下调用 initializeApp 时使用)应该足以读取和写入 Cloud Firestore,除非对该帐户执行了一些会撤销其访问。
  • @DougStevenson 但我认为您在本地工作时需要设置自己的凭据
  • 使用本地模拟器时,它还应该可以访问默认服务帐户。如果您只是编写代码以在模拟器之外运行,那么您需要提供一个服务帐户。
猜你喜欢
  • 1970-01-01
  • 2018-07-28
  • 2020-12-17
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2020-09-29
  • 2020-04-20
相关资源
最近更新 更多