假设我希望云函数具有如下路径:
如何在Node中实现“登录/”部分?
甚至更复杂的东西,例如
登录/管理员/获取数据
?
我尝试使用
module.exports = {
"login/change_password" = [function]
}
但是在部署时出现错误,并且省略了“ change_password”,因此它仅尝试部署“登录”功能。
我尝试的另一件事是使用快速路由器,但结果是仅部署了一个功能,该功能路由到正确的路径(例如myfunction / login / change_password),这很成问题,因为我每次都必须批量部署并且可以。 t单独部署功能。
答案 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/