gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:47:58 24 4
gpt4 key购买 nike

我想使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com