node.js - RestFul Api Node.js 和 Mongoose : handling errors

标签 node.js mongodb express mongoose

我想使用 Node.js、Express、MongoDB 和 Mongoose 创建一个 Restful API。

架构、模型和路线如下:

// Schema
var OperatorSchema = new Schema({
    name : { type: String, unique: true , required: true},
    short_name : { type: String, unique:true, required: true },
});
Operator = mongoose.model('Operator', OperatorSchema);

// My Api for Operator
app.post('/api/operators', common.createOperator);
exports.createOperator = function(req, res){
    Operator.create(req.body, function (err, operator) {
        // If failed, return error message
        if (err) {
            console.log(err);
            res.send(404, err)
        }
        else {
            res.send(operator)
        }
    })
};

我有三个问题:

1 - 处理这样的错误我发现传递给回调的 err 对象具有不同的结构,具体取决于错误来自 mongoose 还是 mongo。

// Mongo Error:
{
    "name": "MongoError",
    "err": "E11000 duplicate key error index: ussdauto.operators.$name_1  dup key: { : \"OpTest\" }",
    "code": 11000,
    "n": 0,
    "connectionId": 231,
    "ok": 1
}

// Mongoose Error:
{
    "message": "Validation failed",
    "name": "ValidationError",
    "errors": {
    "short_name": {
        "message": "Path `short_name` is required.",
        "name": "ValidatorError",
        "path": "short_name",
        "type": "required"
      }
    }
}

我不想公开有关错误的所有详细信息:只需一条解释错误的消息就足够了,不需要知道它是 mongoerror 还是validationError。你如何管理它?

2 - 第二个问题更具全局性:我将有多个 API,每次我都需要做相同的工作:检查是否有错误,如果有错误,则通过 JSON 格式的 API 返回错误消息,如果不正常继续。如何只使用一个函数来处理错误并在任何地方使用它?

3 - 我来自 python 世界(实际上是 Django),其中 Tastypie 是一个非常棒的模块,它本身就可以处理所有这些东西。你知道 Node.js + Express 是否存在这样的模块吗?

最佳答案

您可以使用名为 processMongooseError(err) 的函数创建一个 Utils 模块(或者您真正喜欢的函数)。然后,您可以在函数中进行简单的检查,以确定错误的类型,然后返回简单的错误消息。我在下面提供了一个我正在讨论的示例。

module.exports.processMongooseError = function(err) {
    if(err.name == "MongoError") {
        // mongo db error

    } else if(err.name == "ValidationError") {
        // mongoose error

    }
}

无论您在何处需要,都可以需要此模块,并且应该可以解决您的第二个问题。

关于node.js - RestFul Api Node.js 和 Mongoose : handling errors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20021324/

相关文章:

angularjs - Angular $http GET 不将字符串传递到后端。不明确的?

node.js - express3 - 尝试路由文件

Python "int64"无法转换为 MySQL 类型

node.js - 长级别升级查询

angularjs - 如何从 Controller 页面重定向页面? - Node.js

JavaScript:将 post 请求 json 字符串附加到现有 json 文件

javascript - Node.js fs 获取目录中文件的图标

node.js - Elastic Beanstalk 运行部署后脚本

node.js - 在WebStorm IDE中添加库文件

node.js - 是否可以将额外的参数传递给 Mongoose 更新回调