如何在Node with Nest.js中获取客户端和服务器应用程序分离时的用户IP地址

kjthegm6  于 2023-02-15  发布在  Node.js
关注(0)|答案(4)|浏览(354)

我有两个应用程序,一个是前端(react.js),另一个是REST API后端(基于express.js的nest.js)。当前端客户端向后端发出请求时,如何获取访问后端的用户的IP地址?
我检查了此问题并尝试了解决方案
With separate client and server apps, how do I get a user's IP address, in Node with Koa?
Express.js: how to get remote client address
但我得到的是前端的服务器IP,而不是客户端IP。
有没有一种方法没有任何变化的前端应用程序,我得到真实的的客户端IP在nest.js?

8gsdolmq

8gsdolmq1#

根据NestJS文档,有一个装饰器可以用来获取请求的IP地址,它的用法如下:

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

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

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

xlpyo6sf

xlpyo6sf2#

您可以从Request对象中提取IP地址
我使用它作为一个中间件打印用户的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();
    }
}
raogr8fs

raogr8fs3#

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

npm i --save request-ip
npm i --save-dev @types/request-ip

main.ts文件中,在应用中注入request-ip中间件:

app.use(requestIp.mw());

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

req.clientIp

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

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);
});

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

@Get('/users')
async users(@IpAddress() ipAddress){
}

在github中检查以下问题。

bbuxkriu

bbuxkriu4#

如果您可以使用第三方库。您可以检查request-ip
https://github.com/pbojinov/request-ip

相关问题