【问题标题】:Forward any Nodejs request to another servers将任何 Nodejs 请求转发到其他服务器
【发布时间】:2020-05-26 13:54:32
【问题描述】:

假设我想为微服务实现 API 网关。我在网关中有这种类型的路由:

app.all('/api/users-service/*', (req, res, next) => {

});

我想做的是在不知道GETPOST 或其他东西的情况下将req 转发给服务。我还可能需要构建两个不同的请求,将它们转发到两个不同的服务并在网关中返回合并的响应。类似的东西:

app.all('/api/users-service/*', (req, res, next) => {
    const user = await request(req, 'http://first-service/api/user/' + req.body.userId);
    const products = await request(req, 'http://second-service/api/products');
    res.status(200).json({
        user: user,
        products: products
    });
});

我知道这是一个不好的例子,但希望你能理解我想要做什么。

【问题讨论】:

  • 我想弄清楚如何转发请求,最好的方法是什么,我应该使用什么 npm 包?如何使用它?这样我就可以使用给定的请求并创建另一个或多个请求。
  • 您将req 传递给的函数,接受什么? request 模块不能那样工作。
  • 我知道,我只是想解释一下我想要实现的目标
  • 您必须手动为来自req 对象的请求构建请求选项。
  • 您正在寻找的术语是“代理”。您可以获得只需要配置的预制代理服务器(例如 nginx),或者您可以获得可以在 node.js 中使用的模块,您可以在 node.js 代码中配置和启用这些模块。只需在 NPM 中搜索“代理”,您就会在那里找到很多模块。或者,您可以构建自己的,这将涉及检查传入请求,设置匹配的传出请求,然后将响应通过管道返回给发起者。

标签: javascript node.js api proxy microservices


【解决方案1】:

您绝对可以将请求转发到其他服务,在某些情况下,代理正是您所需要的,但在其他情况下,您可能想要做一些更复杂的事情,例如处理请求和响应。

在这种情况下,您可以尝试以下方法:

const rp = require("request-promise-native");
const bodyParser = require("body-parser");

const userServiceRootUrl = "http://first-service/api/user/";
const productServiceRootUrl = "http://second-service/api/products/";

app.all("/api/users-service/*", bodyParser.json(), async (req, res) => {
    console.log("/api/users-service/ path:", req.params[0]);
    const user = await rp({ baseUrl: userServiceRootUrl, url: req.params[0], body: req.body, json: true, method: req.method });
    const products = await rp({ url: productServiceRootUrl });
    res.status(200).json({
        user: user,
        products: products
    });
});

在这个例子中,我们使用request-promise-native,因为它为我们提供了一个基于promise的api,您也可以使用node-fetch或其他一些http客户端。

在这种情况下,您还可以在快速服务器中创建模拟端点来测试响应处理,例如:

app.all("/api/user/*", bodyParser.json(), async (req, res) => { 
    console.log("/api/user/", req.path);
    res.json( { name: "joe smith" })
});

app.all("/api/products/", bodyParser.json(), async (req, res) => { 
    console.log("/api/products/", req.path);
    res.json( [{ id: 1, name: "some product" }]);
});

然后只需根据需要更改您的 userServiceRootUrl 和 productServiceRootUrl,例如

http://localhost:<port>/api/user/
http://localhost:<port>/api/products/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2018-01-09
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多