我正在尝试向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 = '';
}
}
}
答案 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 = '';
}
}
}