#package #nestjs
TL;DR Знайте заголовок, который использует ваш LB или используйте request-ip.
Хорошей практикой является логирование ip адрес, с которого идет запрос. В определенных случаях в зависимости от ip может строиться логика работы приложения. Наивный способ, приведенный в #nodejs документации выглядит так:
const http = require('http');const server = http.createServer((req, res) => { const ip = res.socket.remoteAddress; const port = res.socket.remotePort; res.end(`Your IP address is ${ip} and your source port is ${port}.`);}).listen(3000);В реально проекте данный способ не будет работать. Node.js процесс будет находиться за load balancer-ом. В
req.socket.remoteAddress будет находиться именно его ip, а не откуда пришел запрос. Оригинальный ip можно узнать по заголовку X-Forwarded-For или его аналогам (зависит от используемого LB).Если у вас нет информации, как будет развернут ваш код, то стоит использовать пакет request-ip. В его коде идет перебор большинства заголовков в поисках ip.
Если же вы знаете используемый LB, то знаете имя заголовка. Вот пример для #nestjs декоратора:
import { createParamDecorator, ExecutionContext } from '@nestjs/common';import { Request } from 'express';export const UserIp = createParamDecorator((data: unknown, context: ExecutionContext) => { const req = context.switchToHttp().getRequest<Request>(); const forwardedFor = req.header('x-forwarded-for'); if (!forwardedFor) return req.connection.remoteAddress; return forwardedFor.split(',')[0];});