如何设置自定义云功能路径

时间:2019-11-21 21:01:54

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

假设我希望云函数具有如下路径:

  

https://[MY_DOMAIN]/login/change_password

如何在Node中实现“登录/”部分?

甚至更复杂的东西,例如

  

登录/管理员/获取数据

我尝试使用

module.exports = {
    "login/change_password" = [function]
}

但是在部署时出现错误,并且省略了“ change_password”,因此它仅尝试部署“登录”功能。

我尝试的另一件事是使用快速路由器,但结果是仅部署了一个功能,该功能路由到正确的路径(例如myfunction / login / change_password),这很成问题,因为我每次都必须批量部署并且可以。 t单独部署功能。

2 个答案:

答案 0 :(得分:0)

如果您想灵活地定义比函数名称更复杂的路由(路径),则应向Cloud Functions提供Express应用。 express应用程序可以定义将路径组件添加到从index.js导出的函数的基本名称的路由。 documentation for HTTP functions中对此进行了讨论。例如:

const functions = require('firebase-functions');
const express = require('express');
const app = express();
app.get('/some/other/path', (req, res) => { ... });
exports.foo = functions.https.onRequest(app);

在这种情况下,您的所有路径都将挂在路径前缀“ foo”后面。

还有一个官方示例说明了Express应用的使用:https://github.com/firebase/functions-samples/tree/master/authorized-https-endpoint

答案 1 :(得分:0)

通过与道格·史蒂文森(Doug Stevenson)的讨论,我能够更好地表达我的问题,并发现问题已经得到in this question的回答。

这将是我的实现示例:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceCollection services)
        {
            // global cors policy
            app.UseCors(x => x
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());


            app.UseAuthentication();
            app.UseMvc();

            IClientValidator clientValidator = app.ApplicationServices.GetRequiredService<IClientValidator>();
            services.AddDbContext<ClientDbContext>(options =>
                options.UseSqlServer(clientValidator.GetConnectionString()));
        }

我从中得出的结论是,有一个Express应用程序与HTTP功能相对应,因此,如果我想拥有3种不同的功能,则需要3种Express应用程序。

一个好的平衡是每个模块有一个应用程序和一个功能(如上所示),这也意味着您可以在多个模块/ javascript文件中分离功能,以便于维护。

在上面的示例中,我们可以使用以下命令触发这些HTTP函数

const functions = require('firebase-functions'); const express = require('express'); const login = require('./login.js'); const edit_data = require('./edit-data.js'); const login_app = express(); login_app.use('/get_uuid', login.getUUID); login_app.use('/get_credentials', login.getCredentials); login_app.use('/authorize', login.authorize); const edit_data_app = express(); edit_data_app.use('/set_data', edit_data.setData); edit_data_app.use('/get_data', edit_data.getData); edit_data_app.use('/update_data', edit_data.updateData); edit_data_app.use('/remove_data', edit_data.removeData); exports.login = functions.https.onRequest(login_app); exports.edit_data = functions.https.onRequest(edit_data_app);

或者从firebase函数外壳程序中

https://[DOMAIN]/login/get_uuid/