gpt4 book ai didi

node.js - 使用 Promises 处理 Mongoose 的 CastError

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

我正在使用 Mongoose(v. 3.8.8)来更新我的模型“Permission”的一些数据。这是架构:

var PermissionSchema = new Schema({

name : {
type: String, required: true, index: true
},
httpVerb : {
type: String, required: true
},
url : {
type: String, required: true
}
});

mongoose.model('Permission', PermissionSchema);

现在我有一个在另一个模块中使用 Promise 的函数:

module.exports.updatePermission = function (id, updatedPermission) {

var conditions = {_id: id};

var promiseUpdate = Permission.update(conditions, updatedPermission).exec();

logger.debug('this line is not executed when CastError occurs');

var promiseFind = promiseUpdate.then(function (permission) {
return Permission.findOne(conditions).exec();
}).then(null, function (error) {
logger.info('CastError does not get in here');
logger.error(error);
//error handled here
});

return promiseFind;
}

当我使用此示例参数调用该函数时:

id: 53496a2e1722ff2d1a55a4d2
updatedPermission: {name: 'this is my new name'}

一切正常,因为 _id 确实已存在于集合中。

现在,当我使用以下参数故意传递无效且不存在的 _id 时:

id: 53496a2e1722ff2d1a55a4d22
updatedPermission: {name: 'this is my new name'}

我收到以下异常:

CastError: Cast to ObjectId failed for value "53496a2e1722ff2d1a55a4d22" at path "_id"
at ObjectId.cast (/home/jhon/environment/workspaces/nodejs-workspace/auth/server/node_modules/mongoose/lib/schema/objectid.js:116:13)
at ObjectId.castForQuery (/home/jhon/environment/workspaces/nodejs-workspace/auth/server/node_modules/mongoose/lib/schema/objectid.js:165:17)
at Query.cast (/home/jhon/environment/workspaces/nodejs-workspace/auth/server/node_modules/mongoose/lib/query.js:2291:32)
at castQuery (/home/jhon/environment/workspaces/nodejs-workspace/auth/server/node_modules/mongoose/lib/query.js:2015:18)
at Query.update (/home/jhon/environment/workspaces/nodejs-workspace/auth/server/node_modules/mongoose/lib/query.js:1704:21)
at Function.update (/home/jhon/environment/workspaces/nodejs-workspace/auth/server/node_modules/mongoose/lib/model.js:1606:13)
at Object.module.exports.updatePermission (/home/jhon/environment/workspaces/nodejs-workspace/auth/server/app/repository/auth/PermissionRepository.js:50:36)

我预计当 Promise 被拒绝时,即在 updatePermission 函数的第二个“then”中,会出现此错误。

问题是:这是 Mongoose 的 bug 吗? - 在不使用 try/catch 的情况下如何处理这个问题?

最佳答案

刚刚找到了在这种特殊情况下如何使用 promise 来做到这一点。 Mongoose 有一个函数 findOneAndUpdate (http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate),它按预期工作。 CastError 通过拒绝传递。这样我就可以在没有 try/catch block 的情况下处理错误。

这是代码(PermissionRepository.js):

module.exports.updatePermission = function (id, updatedPermission) {
var conditions = {_id: id};

var promiseUpdate = Permission.findOneAndUpdate(conditions, updatedPermission).exec();

return promiseUpdate;
}

以下代码调用前一个代码(CastError 在第二个“then”中处理):

module.exports.updatePermission = function (req, res) {
var id = req.query.id;
var updatedPermission = req.body;

var permissionRepository = repositoryFactory.getPermissionRepository();
var promise = permissionRepository.updatePermission(id, updatedPermission);

promise.then(function (permission) {
if (!permission) {
res.status(404).json(Error.resourceNotFound);
} else {
res.status(200).json(permission);
}
}).then(null, function (error) {
logger.error(error.stack);
res.status(500).json(Error.databaseError(error.message, error));
});
}

现在我非常确定方法更新中存在错误( http://mongoosejs.com/docs/api.html#model_Model.update )。我会举报的。

关于node.js - 使用 Promises 处理 Mongoose 的 CastError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23038557/

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