Основная проблема
Как создать в экспрессе новый запрос к облачным функциям Google, содержащий тот же IP-адрес, что и исходный запрос клиента ?
Или как я могу прокси клиентский запрос через экспресс в Google Cloud Functions, сохранив IP-адрес , поэтому Google Cloud Functions показывает мне IP-адрес клиента вместо IP-адреса сервера nodejs.
Код
Экспресс-приложение
// app.js
const express = require('express');
const request = require('request');
const nocache = require('nocache');
const cors = require('cors');
const API_ENDPOINT = 'https://project-name.cloudfunctions.net/cloudfunction-name';
const app = express();
const port = 3000;
app.use(nocache());
app.use(cors());
app.get('/test', function (req, res) {
req.pipe(
request({
qs:req.query,
uri: API_ENDPOINT,
json: true,
gzip: true,
ip: req.ip
}, (error, response, body) => {
console.log(body)
console.log(req.ip)
})
).pipe(res);
});
app.listen(port, function () {
console.log('Example app listening on port ' + port +'!');
});
CloudFunctions
const cors = require('cors')
const localeCode = require('locale-code');
function location(req, res) {
let languages = req.acceptsLanguages();
let lang = '';
if(languages.length > 0){
lang = localeCode.getLanguageCode(languages[0]);
}
let data = {
country: req.headers["x-appengine-country"].toLowerCase(),
region: req.headers["x-appengine-region"].toLowerCase(),
city: req.headers["x-appengine-city"].toLowerCase(),
userIP: req.headers["x-appengine-user-ip"],
language: lang
};
// Json response is gzipped by CloudFunctions
res.json(data)
}
exports.init = (req, res) => {
const corsHandler = cors({ origin: true })
return corsHandler(req, res, function() {
return location(req, res);
});
};
CloudFunctions Request выглядит следующим образом. (Json передается в запросе "body")
{
country: "de",
region: "he",
city: "frankfurt",
userIP: "35.xxx.xxx.xxx",
language: "de",
}
То, что я пробовал до сих пор
Я искал несколько часов и не смог найти ни одного примера, как это можнобыть достигнутым.
Насколько я понимаю, эта часть кода должна передавать (прокси) клиентский запрос к API CloudFunctions и обратно запрашивающему (экспресс-приложение), сохраняя запрос.
req.pipe(
request({
qs:req.query,
uri: API_ENDPOINT,
json: true,
gzip: true,
ip: req.ip
}, (error, response, body) => {
console.log(body)
console.log(req.ip)
// Here comes the logic for redirecting clients
})
).pipe(res);
Также добавление или удаление этого фрагмента ниже не имеет значения. userIP в объекте ответа всегда содержит IP-адрес сервера, а не IP-адрес клиента.
ip: req.ip