2017-12-12 1 views
3

필터 계층을 활성화하려는 Dto가 있습니다. selectFields 메서드는 반환해야하는 필드 이름의 배열을 사용하고 다른 속성은 제거됩니다.
클래스의 속성을 열거하여 루프를 통해 필터링 된 것들을 null로 설정할 수있는 간단한 방법은 무엇입니까?
BaseDto에서 거짓 값을 치료합니다 (사실 저는 여기에도 같은 기능이 필요합니다).ES6 클래스의 필터 속성

class UserServiceDto extends BaseDto { 
    constructor(userDto) { 
    super(); 
    this.fbUserId = userDto.fbUserId; 
    this.fbFirstName = userDto.fbFirstName; 
    this.fbLastName = userDto.fbLastName; 
    this.gender = userDto.gender; 
    this.birthdate = userDto.birthdate; 
    this.aboutMe = userDto.aboutMe; 
    this.deviceToken = userDto.deviceToken; 
    this.refreshToken = userDto.refreshToken; 
    this.updatedAt = userDto.updatedAt; 
    this.createdAt = userDto.createdAt; 
    } 

    selectFields(fields) { 
    // --> what's your take? 
    } 

    toJson() { 
    return super.toJson(); 
    } 
} 

편집 :
는 서비스 계층은 모든 데이터베이스 필드를 포함 저장소 계층에서 DTO를받습니다. ServiceLayerDto는 웹 API에서 필요하지 않은 필드를 필터링하는 것을 목표로합니다 (보안 필드 (예 : PK 필드, isDeleted 등)로 노출되어서는 안됩니다). 웹 층 (컨트롤러)는 HTTP 클라이언트로 보내는 반환 값은 일반 JSON 객체가 될 것

return new UserServiceDto(userDto) 
    .selectFields('fbUserId', 'fbFirstName', 'fbLastName', 'birthdate', 'aboutMe', 'updatedAt', 'createdAt') 
    .toJson(); 

: 그래서 결과는 내가 좋아하는 뭔가를 보일 것에 대한 서비스 방법의 끝에서 찾고 있어요 것 .

+1

'selectFields'와 예상되는 반환 값에 대한 호출의 예를 제공 할 수 있습니까? –

+0

@ibrahimmahrir 유스 케이스를 추가했습니다. 당신이 이것을 잘 받아들이면 주저하지 마십시오. 감사합니다 – Trace

+0

lodash의 ['pick'] (https://lodash.com/docs/4.17.4#pick) –

답변

2

는 확산 연산자를 확인하는 경우, 당신은 방법 다음 시도 할 수 있습니다 :

class UserServiceDto { 
    constructor() { 
    this.a = 1; 
    this.b = 2; 
    this.c = 3; 
    } 
    selectFields(...fields) { 
    const result = {}; 
    fields.forEach(key => result[key] = this[key]); 
    return result; 
    } 
} 

new UserServiceDto().selectFields('a', 'c'); // {a: 1, c: 3} 

super.toJson() 전화를 내다 보면서, 나는 그것이 인해 인스턴스되지 않을 것 내 selectFields() 호출의 결과로 작동하지 않을 생각 UserServiceDto 클래스입니다.

  • selectFields() 몸 안에 새로운 UserServiceDto 객체를 생성 하지...fields 배열에 나열된 모든 필드를 (자바 스크립트 delete이 좋아요이다)을 제거하고 반환; 내가 보는이 시점에서 몇 가지 가능한 방법이 있습니다
  • 에 긍정적 인 논리를 저장하고 생성해야하는 해당 소품 만 전달하려면 UserServiceDto 생성자 매개 변수로 재생하십시오. 이 경우 임시 객체를 인스턴스화하면 속성 제거가 필요하지 않습니다.
  • 변화 toJson 방법의 서명, 또는 더 나은 필드의 배열을 전달하고 toJson 방법 안에 현재 selectFields 로직을 넣을 수 있도록하는 새로운 서명을 추가 (및 selectFields 방법 모두 제거) : new UserServiceDto().toJson('a', 'c')를 ...
+0

감사합니다. 접근 방식은 모두 흥미 롭습니다. 제한된 '보기' 웹 레이어는 서비스 레이어를 호출 할 수 있습니다 (반면 리포지토리는 '테이블'을가집니다). 이 사용 사례에 대한 답변을 수락 하겠지만 전반적인 앱 아키텍처 (즉, 개별 필드 필터링을 사용하여 dtos를 전달하는 대신 이름이 지정된 '보기'지정 및 반환)에 적합한 견고한 솔루션을 찾을 수 있는지 확인할 수 있습니다. 모든 서비스 방법에 대해). – Trace

0

궁극적으로 정보에 대한, 내 애플 리케이션 아키텍처를 변경했습니다.

저장소는 서비스 계층으로 Dto를 반환합니다 (SQL 쿼리에서 직접 매핑되는 dto).
서비스는 Dto를 기반으로 정적보기를 작성하고 웹 레이어 (일반 json 객체로 표시됨)로 반환합니다. 내 디렉토리 구조에서

, 나는이 :

- service 
-- views 
--- index.js 
--- UserInfo.js 

뷰는 간단한 필터입니다. 예 : UserInfoView :

exports.build = ({ fbUserId, fbFirstName, fbLastName, gender, birthdate, aboutMe, updatedAt, createdAt }) => { 
    return { 
    fbUserId, 
    fbFirstName, 
    fbLastName, 
    gender, 
    birthdate, 
    aboutMe, 
    updatedAt, 
    createdAt, 
    }; 
}; 

보기를 사용하십시오.서비스에 UserInfoView은 다음과 같습니다

const Views = require('../service/views'); 

exports.findActiveByUserId = async (pUserId) => { 
    const userDto = await UserRepository.findActiveByUserId(pUserId); 
    if (!userDto) { 
    throw new ServiceError(Err.USER_NOT_FOUND, Err.USER_NOT_FOUND_MSG); 
    } 
    return Views.UserInfo.build(userDto.toJson()); 
}; 

나는이 문제에 내 초기 걸릴에 비해 훨씬 더 많은 설명이라고 생각합니다. 또한 데이터 객체를 평이하게 유지합니다 (추가 메서드가 필요하지 않음).
웹 레이어에서 유형 (보기)을 요청할 필요가 없다는 사실을 유감스럽게 생각합니다. 나중에이 문제를 Typescript로 해결할 수 있습니다.