Переадресация любого запроса Nodejs на другие серверы. - PullRequest
0 голосов
/ 11 февраля 2020

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

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

});

Что я хочу сделать, так это переслать req на обслуживание, не зная, что это 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 Ответ

1 голос
/ 11 февраля 2020

Вы, безусловно, можете пересылать запросы другим службам, в некоторых случаях прокси будет именно тем, что вам нужно, но в других вы можете захотеть сделать что-то более сложное, например, обрабатывать запросы и ответы.

В этом случае вы можете попробовать что-то вроде ниже:

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-обещание-native , так как оно дает нам обещание на основе api, вы также можете использовать node-fetch или какой-либо другой http-клиент.

В этом случае вы также можете создать фиктивные конечные точки на сервере express для проверки обработки ответов, например:

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/
...