【发布时间】:2014-08-28 13:39:52
【问题描述】:
这就是我的 node.js 服务器的组织方式
问题:API 通过模型(猫鼬)向我的 mongodb 数据库发出请求。所以在 API 层我可以拥有:
User.findById(id, function(user) {
if(user._id !== userid) return deferred.reject(new Error()); // ??
if(!user) return deferred.reject(new Error()); // ??
user[field] = value;
user.save(function() {
deferred.resolve(user);
});
});
但是我应该抛出什么错误呢?什么方法会更合适和更用户友好。例如,我可以尝试:
if(user._id !== userid) return deferred.reject(new Error(403));
但这意味着没有消息,只有错误代码:/
我尝试的另一种解决方案:
exports.errors = errors =
NOT_FOUND:
id: "NOT_FOUND"
code: 404
message: "Can't found requested object. Please retry"
UNAUTHORIZED:
id: "UNAUTHORIZED"
code: 401
message: "Please login first"
FORBIDDEN:
id: "FORBIDDEN"
code: 403
message: "Access denied."
DATABASE_ERROR:
id: "DATABASE_ERROR"
code: 500
message: "Error with databse. Please retry"
exports.throwError = throwError = (message, id) ->
if typeof message is "string" then err = new Error message else err = message
err.type = id
err.data = errors[id]
return err
exports.handleHttp = (err, req, res, format="text") ->
console.log(" Error - #{err.message} (#{err.type}) on #{req.url}".red)
console.log(err.stack)
if format is "text"
res.send err.data.code, "#{err.data.type}: #{err.message}"
if format is "json"
res.send err.data.code,
type: err.data.type
message: err.message
id: err.type
status: "error"
errors: err.errors
所以我会这样使用它:
if(user._id !== userid) return deferred.reject(error.throwError("Forbidden", "UNAUTHORIZED"));
在控制器中(在承诺之后)
.fail (err)->
errors.handleHttp err, req, res, "json"
但我不喜欢这种解决方案,这让我感到苦涩,不满意。还有什么想法吗?
【问题讨论】:
标签: node.js mongodb express error-handling mongoose