当单独的客户端和服务器应用程序在带有 Nest.js 的 Node 中时,如何获取用户的 IP 地址

Moh*_*adi 7 node.js express reactjs nestjs

我有两个应用程序,一个是前端(react.js),一个是 REST API 后端(基于express.js 的nest.js)。前端客户端向后端请求时如何获取访问后端的用户IP地址?

我检查了这个问题并尝试了解决方案

使用单独的客户端和服务器应用程序,如何在 Node 和 Koa 中获取用户的 IP 地址?

Express.js:如何获取远程客户端地址

但我得到的是前端的服务器IP而不是客户端IP。

有没有一种方法无需对前端应用程序进行任何更改,就可以在nest.js中获取真实的客户端IP?

Man*_*rte 17

根据 NestJS 文档,有一个装饰器可用于获取请求 Ip 地址。它的使用方式如下:

import {Get, Ip} from "@nestjs/common"

@Get('myEndpoint')
async myEndpointFunc(@Ip() ip){
  console.log(ip)
}

Run Code Online (Sandbox Code Playgroud)

以下是可以使用的装饰器的完整列表: https: //docs.nestjs.com/custom-decorators

  • 如果您在本地主机上工作,这就是您将得到的响应@Henry (2认同)

Use*_*ion 5

您可以Request

我使用它作为中间件来在日志条目中打印用户的 IP 地址,以下是我的操作方法:

import { Injectable, Logger, NestMiddleware } from "@nestjs/common";
import { NextFunction, Request, Response } from "express";

@Injectable()
export class HttpLoggerMiddleware implements NestMiddleware {
    private logger = new Logger();

    use(request: Request, response: Response, next: NextFunction): void {
        const { ip, method, originalUrl } = request;

        response.on("finish", () => {
            const msg = `${ip} ${method} ${originalUrl}`;
            this.logger.log(msg);
        });

        next();
    }
}
Run Code Online (Sandbox Code Playgroud)


iko*_*jar 3

您可以安装一个名为的库request-ip

npm i --save request-ip
npm i --save-dev @types/request-ip
Run Code Online (Sandbox Code Playgroud)

在您的应用程序中的文件中main.ts注入 request-ip 中间件:

app.use(requestIp.mw());
Run Code Online (Sandbox Code Playgroud)

现在您可以从请求对象访问 clientIp:

req.clientIp
Run Code Online (Sandbox Code Playgroud)

另一种方法是定义装饰器:

import { createParamDecorator } from '@nestjs/common';
import * as requestIp from 'request-ip';

export const IpAddress = createParamDecorator((data, req) => {
    if (req.clientIp) return req.clientIp;
    return requestIp.getClientIp(req);
});
Run Code Online (Sandbox Code Playgroud)

您可以在控制器中使用装饰器:

@Get('/users')
async users(@IpAddress() ipAddress){
}
Run Code Online (Sandbox Code Playgroud)

检查 github 中的以下问题