【问题标题】:Firebase Environment configuration is not workingFirebase 环境配置不起作用
【发布时间】:2020-12-09 10:33:11
【问题描述】:

Firebase 环境变量似乎未定义,即使我按照文档进行了所有操作。

我根据这样的文档设置了我的 firebase 环境:

firebase functions:config:set mailerlite.key='12345' mailerlite.groupid='id123'

通过在我的终端中输入此 CLI

firebase functions:config:get

我找回来了

{
  "mailerlite": {
    "key": "12345",
    "id": "id123"
  }
}

到目前为止一切顺利。但我无法从我的 express.js 访问它。这是我的函数/index.js:

const functions = require('firebase-functions');

const express = require('express');
const bodyParser = require('body-parser');
const fetch = require("node-fetch");
const sensitive = require('./sensitive.js');
var cors = require('cors');


const app = express();


var allowedOrigins = ['http://localhost:8081',
    'https://myapp.com'];
app.use(cors({
    origin: function (origin, callback) {
        // allow requests with no origin 
        // (like mobile apps or curl requests)
        if (!origin) return callback(null, true);
        if (allowedOrigins.indexOf(origin) === -1) {
            var msg = 'The CORS policy for this site does not ' +
                'allow access from the specified Origin.';
            return callback(new Error(msg), false);
        }
        return callback(null, true);
    }
}));
app.use(bodyParser.urlencoded({ extended: true }));
const port = 3000
app.post('/subscribe', (req, res, next) => {

    console.log('key', functions.config().mailerlite.key);
    console.log('stringify', JSON.stringify(req.body));
    console.log('req.body: ', req.body);
    //console.log('req.body.email', req.body.email);

    (async function () {
        try {
            const mailerLiteResponse = await fetch('https://api.mailerlite.com/api/v2/groups/' + sensitive.groupId + '/subscribers', {
                method: 'POST',
                mode: 'Cors',
                headers: {
                    'content-type': 'application/json',
                    'X-MailerLite-ApiKey': functions.config().mailerlite.key,
                },
                body: JSON.stringify(req.body)

            });



            const responseJson = await mailerLiteResponse.json();

            res.status(mailerLiteResponse.status).send(mailerLiteResponse.body);

            console.log('mailer response: ', responseJson);
            console.log('key2', functions.config().mailerlite.key);
        } catch (err) {
            return next(err)
        }
    })();
});

app.listen(port, () => {
    console.log(`App listening at http://localhost:${port}`)
})

exports.app = functions.https.onRequest(app);

一旦我运行服务器,这就是我得到的响应:

TypeError: Cannot read property 'key' of undefined
    at /Users/tomas/code/ambee2_track_progress_server/functions/index.js:44:53
    at Layer.handle [as handle_request] (/Users/tomas/code/ambee2_track_progress_server/functions/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/tomas/code/ambee2_track_progress_server/functions/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/Users/tomas/code/ambee2_track_progress_server/functions/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Users/tomas/code/ambee2_track_progress_server/functions/node_modules/express/lib/router/layer.js:95:5)
    at /Users/tomas/code/ambee2_track_progress_server/functions/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/Users/tomas/code/ambee2_track_progress_server/functions/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/tomas/code/ambee2_track_progress_server/functions/node_modules/express/lib/router/index.js:275:10)
    at /Users/tomas/code/ambee2_track_progress_server/functions/node_modules/body-parser/lib/read.js:130:5
    at invokeCallback (/Users/tomas/code/ambee2_track_progress_server/functions/node_modules/raw-body/index.js:224:16)

【问题讨论】:

  • 你试过console.log('key', functions.config())看看它是否返回任何东西吗?
  • 这是console.log('key', functions.config()) 的输出:key {} 所以,看起来firebase cli 没有正确分配配置键,但是我可以通过firebase functions:config:get 检索它们

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


【解决方案1】:

你有一个更大的问题,只是功能配置。

首先,根本不可能在 Cloud Functions 中侦听端口。这在部署时根本不起作用:

app.listen(port, () => {
    console.log(`App listening at http://localhost:${port}`)
})

Cloud Functions 将安排监听您,并在收到请求时调用您的 API 端点。您只需导出您的 express 应用程序,它就会将其连接到托管套接字。

在对环境配置进行任何操作之前,我建议让您的 express 应用使用一个简单的示例,如 documentation 中所述,然后稍后将配置添加到其中。

【讨论】:

  • 感谢您的回答道格。只想向知识库中添加服务器正常工作的信息(即使使用 app.listen(port,...) 也只是环境配置导致外部出现问题。
  • 在本地测试时可能会起作用,但在部署时会不起作用。 Cloud Functions 根本不支持您所做的事情。
  • 虽然听起来令人惊讶,但它在部署时也能正常工作。我刚刚测试过。
猜你喜欢
  • 2023-03-27
  • 2014-03-11
  • 2020-07-09
  • 2015-06-13
  • 2021-06-09
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
相关资源
最近更新 更多