Пересылать любые запросы Nodejs на другие серверы.

Представьте, что я хочу реализовать API Gateway для микросервисов. У меня есть этот тип маршрута в шлюзе:

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

});

То, что я хочу сделать, это переслать данное требование в службу, не зная, что это GET , POST или что-то еще. Мне также может понадобиться создать два разных запроса, переслать их двум разным сервисам и вернуть объединенный ответ в шлюз. что-то такое:

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
    });
});

Я знаю, что это плохой пример, но надеюсь, вы поймете, что я пытаюсь сделать.

Всего 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
    });
});

В этом примере мы используем запрос-обещание-нативный, поскольку он дает нам API, основанный на обещаниях, вы также можете использовать нод-выборку или какой-либо другой 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/

Есть идеи?

10000