当发送请求/customers/41224d776a326fb40f000001和文件_id 41224d776a326fb40f000001不存在时,doc是null,我正在返回404:
Controller.prototype.show = function(id, res) {
this.model.findById(id, function(err, doc) {
if (err) {
throw err;
}
if (!doc) {
res.send(404);
}
return res.send(doc);
});
};
Run Code Online (Sandbox Code Playgroud)
但是,如果_id不匹配Mongoose所期望的"格式"(我想),例如GET /customers/foo返回一个奇怪的错误:
CastError:对于路径"_id"处的值"foo",转换为ObjectId失败.
那么这个错误是什么?
如何使用Node的驱动程序检查ObjectID是否有效
我试过了 :
var BSON = mongo.BSONPure;
console.log("Validity: " + BSON.ObjectID.isValid('ddsd'))
Run Code Online (Sandbox Code Playgroud)
但我一直得到一个例外而不是真或假.(例外情况只是'抛出e; // process.nextTick错误,或'首次打勾'错误'事件'
我想检查正确的 ObjectID 以继续我的代码。我在 NodeJS 上,我不想收到错误:
错误:传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串
实际上我得到了这些测试:
if (!user.id || !user.id.match("/^[0-9a-fA-f]{24}$") || !typeof(user.id) === 'string') {
console.log("user id is required !")
return callback("user id is required !")
}
Run Code Online (Sandbox Code Playgroud)
对于 24 个十六进制字符的字符串,我得到了这个正则表达式:
!user.id.match("/^[0-9a-fA-f]{24}$")
Run Code Online (Sandbox Code Playgroud)
我正在搜索检查它是否是一个 12 字节的字符串:
!typeof(user.id) === 'string'
Run Code Online (Sandbox Code Playgroud)
我应该如何添加12字节的验证?
有什么想法吗?
据我所知,MongoDB 中的字符串以 UTF-8 格式存储,因此每个字符在 1 到 4 个字节之间。
MongoDB 文档说明了以下关于 ObjectID 的内容:
返回一个新的 ObjectId 值。12 字节的 ObjectId 值包括:
一个 4 字节的值表示自 Unix 纪元以来的秒数,
一个 5 字节的随机值和
一个 3 字节的计数器,从一个随机值开始。
在一个例子中,它显示ObjectId("507f1f77bcf86cd799439011"). 这个字符串虽然在 UTF-8 中是 24 个字节,所以我不明白 12 个字节在哪里发挥作用。