如何为一个Google云功能提供多个API端点

时间:2017-11-07 10:19:54

标签: google-cloud-functions serverless-framework

我有一个谷歌云功能,该功能包含多个模块,这些模块将在不同的路径上调用。

我使用无服务器框架来部署我的功能,但每个功能只有一个路径。 但是我想在AWS无服务器框架中使用多个路径来实现一个功能

假设user云函数有两条路径/user/add/user/remove,两条路径都应该调用相同的函数。 像这样:

serverless.yml

functions:
  user:
    handler: handle
    events:
      - http: user/add
      - http: user/remove

4 个答案:

答案 0 :(得分:1)

是的,确实没有实际的REST服务备份Google云功能。它使用开箱即用的HTTP触发器。 因此,为了匆匆忙忙,我使用我的有效负载来确定要在身体中执行哪个动作,我要添加一个名为" path"的键。

E.g: 功能USER

1.添加用户

{
"path":"add",
"body":{
"first":"Jhon",
"last":"Doe"
}
}

2.删除用户

{
"path":"remove",
"body":{
"first":"Jhon",
"last":"Doe"
}
}

此外,如果您的操作纯粹是CRUD,则可以使用request.method GET,POST,PUT,DELETE来确定操作。

答案 1 :(得分:0)

目前,在谷歌中,每个功能只允许一个事件定义。 For more

答案 2 :(得分:0)

GCF 目前不支持函数内的路由。因此,解决方案取决于用例,但对于问题中的示例等大多数简单情况,编写一个简单的路由器是一种合理的方法,不涉及更改正常请求格式。

如果涉及参数或通配符,请考虑使用 route-parserdeleted answer 建议以 this app 为例。

Express 请求对象有一些您可以利用的有用参数:

  • req.method 给出 HTTP 动词
  • req.path 给出没有查询字符串的路径
  • req.query 解析键值查询字符串的对象
  • req.body 解析的 JSON 正文

这是一个简单的概念验证来说明:

const routes = {
  GET: {
    "/": (req, res) => {
      const name = (req.query.name || "world");
      res.send(`<!DOCTYPE html>
        <html lang="en"><body><h1>
          hello ${name.replace(/[\W\s]/g, "")}
        </h1></body></html>
      `);
    },
  },
  POST: {
    "/user/add": (req, res) => { // TODO stub
      res.json({
        message: "user added", 
        user: req.body.user
      });
    },
    "/user/remove": (req, res) => { // TODO stub
      res.json({message: "user removed"});
    },
  },
};

exports.example = (req, res) => {
  if (routes[req.method] && routes[req.method][req.path]) {
    return routes[req.method][req.path](req, res);
  }

  res.status(404).send({
    error: `${req.method}: '${req.path}' not found`
  });
};

用法:

$ curl https://us-east1-foo-1234.cloudfunctions.net/example?name=bob
<!DOCTYPE html>
      <html lang="en"><body><h1>
        hello bob
      </h1></body></html>
$ curl -X POST -H "Content-Type: application/json" --data '{"user": "bob"}' \
> https://us-east1-foo-1234.cloudfunctions.net/example/user/add
{"message":"user added","user":"bob"}

如果您遇到 CORS 和/或预检问题,请参阅 Google Cloud Functions enable CORS?

答案 3 :(得分:0)

您可以使用 Firebase 托管来重写网址。

在您的 firebase.json 文件中:

"hosting": {
    "rewrites": [
          {
            "source": "/api/v1/your/path/here",
            "function": "your_path_here"
          }
    ]
}

请记住,这是一种解决方法,它有一个主要缺点:您将支付双重打击费用。如果您的应用必须扩展,请考虑这一点。