Экспресс: Создать новый запрос с IP-адресом клиента в Google Cloud Functions - PullRequest
0 голосов
/ 21 октября 2019

Основная проблема

Как создать в экспрессе новый запрос к облачным функциям 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...