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