logo科技微讯

如何在云函数实现 http-proxy

作者:科技微讯
日期:2022-06-09
📝 笔记

这里的 http proxy 是指,把云函数的触发方式设置为 http 触发,然后访问该云函数的 http 链接,事实上相当于访问其他链接,例如 google.com。客户端不直接访问目标链接,而是通过云函数访问目标链接,云函数再把响应返回给客户端。

之所以有这个需求,主要是 2 个原因:

  • 一些链接在国内访问速度很慢,需要借助国外的云函数获取这些数据,然后再返回国内;
  • 部分 API 有访问频率限制,而云函数有很多 IP 地址,可以在一定程度上避免被限制;

市面上的云函数貌似有 3 种,如果 cloudflare 的 service worker 也视作一种云函数的话:

  • aws lambda、腾讯 scf、百度 cfc、华为 fg、阿里 fc,他们的入参往往是 event、context,不是 res、req 对象;
  • vercel 的云函数,入参就是 res、req;
  • service worker、deno deploy、vercel middleware

对于第一种,可以使用这些工具实现:

代码示例:

//运行在腾讯云 tcb 的函数示例,函数入参是 event、context
const { createProxyMiddleware } = require("http-proxy-middleware");
const serverless = require("serverless-http");
const express = require("express");
const app = express();

exports.main = async (eve, context) => {
  const event = typeof eve === "string" ? JSON.parse(eve) : eve;
  const url = event.queryStringParameters.url;
  if (!url) {
    return "请提供 url";
  }
  console.log("目的 url:", url);
  const jsonPlaceholderProxy = createProxyMiddleware({
    target: url,
    changeOrigin: true,
  });
  app.use("/", jsonPlaceholderProxy);
  const handler = serverless(app);
  const result = await handler(event, context);
  return result;
};

对于第二种,只需要 http-proxy-middleware,参考这篇文章

对于第三种,似乎不需要借助任务工具,service worker 的例子。

donation赞赏
thumbsup0
thumbsdown0
暂无评论