向快速请求对象添加属性

时间:2019-12-15 12:00:08

标签: javascript typescript express nestjs

我正在尝试向Express请求对象添加属性“ forwardingUrl”。

我尝试通过创建文件./typing.d.ts来进行声明合并:

declare namespace Express {
  export interface Request {
    forwardingUrl: string;
  }
}

在编辑器中,我可以使用属性并访问它,但是在编译时出现以下错误:

Property 'forwardingUrl' does not exist on type 'Request<ParamsDictionary>'.

我想念什么?

编辑

出现错误的代码:

import { Middleware, Request } from '@tsed/common';
import { Request as ExpressRequest } from 'express';
@Middleware()
export class Wso2ForwardingUrlParser {
    async use(@Request() request: ExpressRequest) {
        if (request.header('X_FORWARDED_HOST') && request.header('X_FORWARDED_PREFIX')) {
            request.forwardingUrl = `https://${request.header('X_FORWARDED_HOST')}${request.header('X_FORWARDED_PREFIX')}`;
        }   else {
            request.forwardingUrl = '';
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,并在抛出错误的行上方添加了//@ts-ignore来解决了这个问题:

import { Middleware, Request } from '@tsed/common';
import { Request as ExpressRequest } from 'express';

@Middleware()
export class Wso2ForwardingUrlParser {
    async use(@Request() request: ExpressRequest) {
        if (request.header('X_FORWARDED_HOST') && request.header('X_FORWARDED_PREFIX')) {

            //@ts-ignore
            request.forwardingUrl = `https://${request.header('X_FORWARDED_HOST')}${request.header('X_FORWARDED_PREFIX')}`;

        }   else {

            //@ts-ignore
            request.forwardingUrl = '';
        }
    }
}

我还建议稍后使用参数装饰器在代码中获取此值。由于您已经通过中间件将这个额外的“ forwardingUrl”属性添加到了请求实例中,因此可以像下面这样创建一个参数装饰器:

// ./ForwardingUrlDecorator.ts

import { createParamDecorator } from '@nestjs/common';

export const ForwardingUrl = createParamDecorator((_data: any, req: any) => {
    return req.forwardingUrl;
});

然后,您可以在控制器中获取该值,而不必在方法中引用整个express实例作为参数:

import { Controller } from '@nestjs/common';
import { ForwardingUrl } from './ForwardingUrlDecorator';

@Controller()
export class YourController {

    @Get()
    public async getTheThing(@ForwardingUrl() forwardingUrl: string) {
        //...
    }
}

答案 1 :(得分:0)

添加扩展请求的新模型

import {Request} from "@tsed/common";

export interface RequestModel extends Request {
    forwardingUrl: string
}

然后在方法中使用它

import { Middleware, Request } from '@tsed/common';
import { Request as ExpressRequest } from 'express';
@Middleware()
export class Wso2ForwardingUrlParser {
    async use(@Request() request: RequestModel) {
        if (request.header('X_FORWARDED_HOST') && request.header('X_FORWARDED_PREFIX')) {
            request.forwardingUrl = `https://${request.header('X_FORWARDED_HOST')}${request.header('X_FORWARDED_PREFIX')}`;
        }   else {
            request.forwardingUrl = '';
        }
    }
}