2013-11-24 111 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'); 
} 

我看到那裏2個選項。

  1. 使用原始POST數據調用服務函數'register',清理並驗證它,然後僅推回驗證錯誤。如果存在驗證錯誤,則在渲染視圖之前在控制器中清理它們。
  2. 與第一個相同,但我們推回驗證錯誤和消毒字段。
+0

這沒有一個正確的答案,哪一個最適合您的需求? – WiredPrairie

回答

2

如果這是一個小項目不要打擾,只是做一些有用的工作。

但是,如果它是一個大的(讀:長期)的項目,則:

如果通過「淨化」你的意思是HTTP/HTML清理(或輸入,或顯示信息),那麼這屬於控制器。這樣想一下:控制器可能不是唯一將輸入傳遞給服務層的地方。將來你可能有API訪問服務。或者測試驅動程序可以直接調用它,而不需要通過HTTP。所以HTTP/HTML就是傳輸,並且特定的邏輯應該在服務之外。

但是,如果「消毒」指的是商業邏輯消毒(例如:您不允許存在不存在的國家/地區代碼),那麼出於完全相同的原因,這應該在服務中。

+0

感謝您的回覆。 這不是一個小項目。通過衛生處理我的意思是html逃避輸入和類似的東西(非業務邏輯)。我想我會選擇#1。我只是簡單地清理(html轉義)所有輸入字段並將它們推回到視圖。 – RlyDontKnow

5

如果您使用快遞,一個有趣的選項是:

  • 創建中間件和使用它作爲一個驗證層,使用express-validator,這是基於node-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(); 
        } 
    
    } 
    
  • 然後,在控制器,簡單地獲得驗證請求參數和運行在註冊邏輯(您的register函數調用和響應渲染),

恕我直言,這樣你可以保持你的代碼更乾淨和解耦。

+0

這是我如何做小項目驗證,但現在我將不得不驗證控制器中的參數,然後再次在服務。我添加了服務層,因爲將來我會添加對不同協議的支持,所以驗證服務層中的輸入更加乾燥。 謝謝你的回覆:) – RlyDontKnow