2017-03-06 53 views
0

我正在將我們的代碼重構爲承諾。節點正確返回錯誤(例如驗證錯誤)

兩個街區與示例代碼:

user.service.js

export function updateUserProfileByUsername(req, res) { 
userController.getUserByUsername(req.params.username) 
    .then((userProfile) => { 
     return userController.saveUserProfileByUser(userProfile, 
      req.body.email, 
      req.body.username, 
      req.body.firstname, 
      req.body.lastname) 
    }) 
    .then((updated_user) => { 
     res.status(200).json(updated_user.profile); 
    }) 
    .catch((err) => { 
     res.status(404).send('something went wrong'); 
    }); 
} 

export function getUserProfileByUsername(req, res) { 
userController.getUserProfileByUsername(req.params.username) 
    .then((userProfile) => { 
     res.status(200).json(userProfile); 
    }) 
    .catch((err) => { 
     res.status(404).send('something went wrong'); 
    }) 
} 

user.controller.js

export function getUserProfileByUsername(username) { 
return User.findOne({ 
     'username': username 
    }).exec() 
    .then((user) => { 
     if (user) 
      return user.profile; 
     else 
      throw new Error("user not found!"); 
    }); 
} 

export function getUserByUsername(username) { 
return User.findOne({ 
     'username': username 
    }).exec() 
    .then((user) => { 
     if (user) 
      return user; 
     else 
      throw new Error("user not found!"); 
    }); 
} 

export function saveUserProfileByUser(user, email, username, firstname, lastname) { 
    user.email = email; 
    user.username = username; 
    user.firstname = firstname; 
    user.lastname = lastname; 
    return user.save(); // returns a promise 
} 

我們路由在用戶/索引輸入。 js,進入service.js,控制器處理我們的數據庫工作和錯誤。

我想要實現的是將擬合錯誤發送給客戶端。 像:「用戶不存在」或「用戶名太長」更新錯誤的用戶時,等

,如果我嘗試錯誤發送給客戶端,我就把一個空的JSON作爲結果({})。如果我記錄錯誤,我會得到完整的堆棧跟蹤,包括驗證錯誤。

.catch((err) => { 
     console.log(err) // shows me full stacktrace of the error 
     res.status(404).send(err); //sends {} to the client 
    }) 

我該如何實現承諾?我應該添加額外的中間件發送正確的錯誤消息嗎?

我真的很感激這個方向正確的方向。 在此先感謝!

回答

0

因爲err是一個對象,我假設express將轉換爲JSON。但是,當您將錯誤串聯起來時,您會得到'{}';

如果你想返回堆棧跟蹤try .send(err.stack)。

另外,如果你只希望該消息並沒有你可以使用err.message整個堆棧。

.catch((err) => { 
    console.log(err) 
    res.status(404).send(err.stack); 
}) 
+0

明顯和簡單,像往常一樣。非常感謝! –