Nodejs + Typescript:如何使用模型定义响应结构

时间:2018-09-01 16:49:27

标签: node.js typescript decorator

我是nodejsexpress的新手。

我正在尝试使用ts-express-decorators创建一个休息服务。

在我的controller中,我有一个POST方法可以更新用户数据并返回更新的结果。

但是我要更新的集合中有几个字段我不想发送给用户。

我的controller.ts

import { Controller, Get, PathParams, Authenticated, Required, Req, Post, Res, BodyParams } from 'ts-express-decorators';
import { Returns } from 'ts-express-decorators/lib/swagger';

@Controller('/users')
@Authenticated()
export class UserController {
    constructor(private userService: UserService) {    }

@Post('/update')
@Returns(UserResponse)
async updateUser(
    @Req() req,
    @Res() res) {
    const data = await this.userService.updateUser(req.body)
    return data;
    }
}

这是user.ts

export class UserResponse {
    @JsonProperty()
    email: string;

    @JsonProperty()
    firstName: string;

    @JsonProperty()
    lastName: string;

    @JsonProperty()
    picture?: string;

    @JsonProperty()
    _id: string;

}

我想像UserResponse类中那样构造响应。但是目前,它从集合中返回的json将会存储所有数据。

service.ts

async updateUser(data) {
    return await this.userRepository.findByIdAndUpdate({_id: data.id}, data);
}

样板中的默认方法遵循相同的结构。

请指出我所缺少的或者有更好的选择来实现这一目标。

我能够在controller.ts中重组响应json,但我不想这样做。

我当前的回复:

{
"_id": "5b6aee50f31f19156c014933",
"email": "test@gmail.com",
"password": "ZAUzmguxklW7769Uc0CrUi",
"firstName": "Test",
"lastName": "Test",
"__v": 0,
"picture": "",
"tokens": []
}

预期的响应:

{
"_id": "5b6aee50f31f19156c014933",
"email": "test@gmail.com",
"firstName": "Test",
"lastName": "Test",
"picture": ""
}

1 个答案:

答案 0 :(得分:1)

现在,当您的代码被转换为JavaScript时,它将简单地返回await this.userService.updateUser(req.body)的结果。

您将需要根据UserResponse变量创建data的新实例。明确设置您要在UserResponse实例中设置的所有字段。然后,您必须返回该UserResponse实例而不是data变量。

示例:

const response = new UserResponse();
response._id = data._id;
response.email = data.email;
response.firstName = data.firstName;
response.lastName = data.lastName;
return response;

我可能会为UserResponse创建一个新的构造函数,该构造函数需要必需的参数。