2013-11-24 4 views
4

나는 컨트롤러 레이어를 가능한 한 가볍게 유지하여 서비스 레이어를 구현하려고합니다. 이제 나는 유효성 검사와 위생 처리에 갇혀있다. 유효성 검사가 서비스 계층에서 수행되어야한다는 것을 알고 있지만 위생 처리는 무엇입니까? 유효성 검사 오류가있을 때 입력 데이터를 다시 렌더링하고 싶습니다.입력 유효성 검사, 위생 및 서비스 계층

//userService.js function 
function register(data, callback) { 
    if (!data) { 
     return callback(new Error('Here some error...')); 
    } 

    /* Sanitize and validate the data */ 

    /* Method #1 */ 
    //If not valid then call back with validationErrors 
    if (notValid) { 
     return callback({ 
      validationErrors: { 
       'username': 'Username is already in use.', 
       'email': 'Invalid characters.', 
      } 
     }); 
    } 

    /* Method #2 */ 
    if (notValid) { 
     return callback({ 
      fields: { 
       //We put here a sanitized fields 

      }, 
      validationErrors: { 
       'username': 'Username is already in use.', 
       'email': 'Invalid characters.', 
      } 
     }); 
    } 

}; 


//userController.js function 
// GET/POST: /register 
function registerAction(request, response, next) { 
    if (request.method === 'POST') { 
     var registerData = { 
      username: request.body['username'], 
      password: request.body['password'], 
      email: request.body['email'], 
      firstName: request.body['firstName'], 
      lastName: request.body['lastName'], 
     }; 

     register(registerData, function(error, someDataIfSucceed) { 
      if (error) { 
       //Re-post the data so the user wont have to fill the form again 

       //Sanitize registerData variable here. 

       return response.render('register', { 
        error: error, 
        validationErrors: error.validationErrors 
       }); 
      }; 

      //User registered succesfully. 
      return response.render('registerSuccess'); 
     }); 

     return; 
    } 

    return response.render('register'); 
} 

거기에는 두 가지 옵션이 있습니다.

  1. 서비스 호출 함수 '등록'을 원시 POST 데이터로 지정하고 유효성을 검사 한 다음 유효성 검사 오류 만 되돌립니다. 유효성 검사 오류가있는 경우보기를 렌더링하기 전에 제어기에서 유효성을 검사하십시오.
  2. 첫 번째 것과 동일하지만 유효성 검사 오류 및 삭제 된 필드를 다시 푸시합니다.
+0

귀하의 요구에 가장 적합한이 답변에 대한 올바른 대답은 아닙니까? – WiredPrairie

답변

2

작은 프로젝트 인 경우 문제가되지 않는다면 효과가있는 것만 수행하십시오. 다음 프로젝트 : 그러나, 그것은 큰 (긴 수명 읽기) : 경우

의 경우는 "위생"에 의해 그런 다음이 (또는 입력, 또는 디스플레이 메시지) HTTP/HTML 위생을 의미 컨트롤러에 속합니다. 이 방법으로 생각해보십시오. 컨트롤러가 서비스 레이어에 입력을 전달하는 유일한 장소가 아닐 수도 있습니다. 앞으로는 서비스에 대한 API 액세스 권한이있을 수 있습니다. 또는 테스트 드라이버가 HTTP를 통하지 않고 직접 호출 할 수 있습니다. 따라서 HTTP/HTML은 전송 일 뿐이며 특정 논리는 서비스 외부에 있어야합니다.

그러나 "sanitization"으로 비즈니스 논리 위생을 의미하는 경우 (예 : 존재하지 않는 국가 코드를 허용하지 않는 경우) 정확히 동일한 이유로 서비스에 있어야합니다. 당신은 Express를 사용하는 경우

+0

답장을 보내 주셔서 감사합니다. 작은 프로젝트가 아닙니다. sanitization에 의해 html은 입력과 같은 것들을 이스케이프하는 것을 의미합니다 (비 비즈니스 로직). 나는 옵션 # 1에 갈 것이라고 생각한다. 나는 모든 입력 필드를 단순하게 삭제 (html 이스케이프)하고 뷰로 다시 밀어 넣을 것이다. – RlyDontKnow

5

, 흥미로운 옵션은 다음과 같습니다

  • 이 미들웨어를 만들고 node-validator을 기반으로 express-validator를 사용하여 검증 층로 사용합니다.

    exports.validate = function(req, res, next) { 
    
        req.assert('username').notEmpty(); 
        req.assert('password').notEmpty(); 
        req.assert('email').isEmail(); 
        req.assert('firstName').len(2, 20).xss(); 
        req.assert('lastName').len(2, 20).xss(); 
    
        var errors = req.validationErrors(true); 
    
        if (errors){ 
        res.status(400).json({ status: 'ko', errors: errors }); 
        } 
        else { 
        next(); 
        } 
    
    } 
    
  • 그런 다음 컨트롤러에 간단히 확인 요청 PARAMS를 획득하고 (당신의 register 함수 호출 및 응답을 가입 로직을 실행합니다 예를 들어 (모든 검증/위생 옵션 노드 검증 설명서를 참조하십시오) 렌더링),

IMHO, 이렇게하면 코드를 더 깨끗하고 분리 할 수 ​​있습니다.

+0

이것은 작은 프로젝트에 대한 유효성 검사를 수행하는 방법이지만 컨트롤러의 매개 변수를 확인한 다음 다시 서비스에서 유효성을 검사해야합니다. 앞으로는 다른 프로토콜에 대한 지원을 추가 할 예정이므로 서비스 레이어를 추가 했으므로 서비스 레이어의 입력을 확인하는 것이 더 위험합니다. 답장을 보내 주셔서 감사합니다.) – RlyDontKnow