在我的后端,我有这个端点:
@Post()
@UseInterceptors(FilesInterceptor('files'))
create(
@UploadedFiles() files: Array<Express.Multer.File>,
@Body() body: MyDto,
) {
console.log(body);
console.log(files);
}
Run Code Online (Sandbox Code Playgroud)
MyDto很简单:
export class MyDto {
year: string
}
Run Code Online (Sandbox Code Playgroud)
当我multipart/form-data仅使用字段或与一个或多个文件一起发送请求(在 Firefox、Chrome 和 Postman 上尝试使用代码)时year,我从第一个console.log(打印 的那个body)中得到:
MyDto {}
Run Code Online (Sandbox Code Playgroud)
当我从正文中删除输入时,端点变为:
@Post()
@UseInterceptors(FilesInterceptor('files'))
create(
@UploadedFiles() files: Array<Express.Multer.File>,
@Body() body,
) {
console.log(body);
console.log(files);
}
Run Code Online (Sandbox Code Playgroud)
本体如图所示:
[Object: null prototype] { year: '2022' }
Run Code Online (Sandbox Code Playgroud)
变量files总是正确的。
如何设置正文的类型?
我main.ts的如下:
const app = await NestFactory.create(AppModule, {
logger: ['log', 'error'],
});
app.enableCors(); …Run Code Online (Sandbox Code Playgroud) 我有一个名为 的控制器User和两个服务类:UserAdminService和UserSuperAdminService。当用户向控制器的任何端点发出请求时User,我想检查发出请求的用户是管理员还是超级管理员(基于令牌中的角色)并实例化正确的服务(UserAdminService或UserSuperAdminService)。请注意,这两个服务实现相同的UserService接口(只是方法的内部发生了一些变化)。我怎样才能用 NestJS 做到这一点?
我尝试过的:
用户模块.ts
providers: [
{
provide: "UserService",
inject: [REQUEST],
useFactory: (request: Request) => UserServiceFactory(request)
}
],
Run Code Online (Sandbox Code Playgroud)
用户服务.factory.ts
export function UserServiceFactory(request: Request) {
const { realm_access } = JwtService.parseJwt(
request.headers["authorization"].split(' ')[1]
);
if (realm_access["roles"].includes(RolesEnum.SuperAdmin))
return UserSuperAdminService;
else
return UserAdminService;
}
Run Code Online (Sandbox Code Playgroud)
用户控制器.ts
constructor(
@Inject("UserService") private readonly userService: UserServiceInterface
) {}
Run Code Online (Sandbox Code Playgroud)
我的代码不起作用的原因之一是因为我返回的是类而不是工厂中的实例化对象,但我希望 NestJS 解决服务依赖关系。有任何想法吗?