如何檢查的對象ID是否有效利用節點的司機MongoDB的節點檢查,如果OBJECTID有效
我想:
var BSON = mongo.BSONPure;
console.log("Validity: " + BSON.ObjectID.isValid('ddsd'))
但我不斷收到一個例外,而不是真或假。 (唯一的例外是隻是一個「扔é; // process.nextTick錯誤,或‘錯誤’的第一跳事件」
如何檢查的對象ID是否有效利用節點的司機MongoDB的節點檢查,如果OBJECTID有效
我想:
var BSON = mongo.BSONPure;
console.log("Validity: " + BSON.ObjectID.isValid('ddsd'))
但我不斷收到一個例外,而不是真或假。 (唯一的例外是隻是一個「扔é; // process.nextTick錯誤,或‘錯誤’的第一跳事件」
不知道其中isValid()
功能來源於但它不是在node-mongodb-native
,你可以。如果你想檢查的24進制字符的字符串使用正則表達式。
var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$");
@ GianPaJ的片段是偉大的兩者,但它需要稍微擴大到非十六進制對象ID的。同一個文件的第32行表示objectID的長度也可以是12個字符。這些鍵由mongodb驅動程序轉換爲24個字符的十六進制ObjectID。
function isValidObjectID(str) {
// coerce to string so the function can be generically used to test both strings and native objectIds created by the driver
str = str + '';
var len = str.length, valid = false;
if (len == 12 || len == 24) {
valid = /^[0-9a-fA-F]+$/.test(str);
}
return valid;
}
你似乎誤解了一個12字節的ObjectID意味着什麼。這是id的二進制(而非十六進制)表示 - 因此,大多數格式的id將會通過測試(任何12個字節形成一個有效的ObjectID)。 – 2014-05-13 20:24:45
我已提交的上拉請求,其公開了一個的isValid方法的JS-BSON庫,作爲邏輯來檢查的objectid串已經在那裏。
請鏈接到您的拉請求,謝謝。 – frontsidebus 2014-02-16 04:35:31
https://github.com/mongodb/js-bson/pull/65 – Mandy 2014-03-20 11:17:31
isValid()
位於js-bson庫中,該庫依賴於node-mongodb-native。
對於任何發現此問題的人,我不建議將此方法重新創建爲其他答案中的建議。相反,繼續使用像原始海報使用的node-mongodb-native,以下示例將訪問js-bson中的isValid()
方法。
var mongodb = require("mongodb"),
objectid = mongodb.BSONPure.ObjectID;
console.log(objectid.isValid('53fbf4615c3b9f41c381b6a3'));
這是真正的解決方案,謝謝:) – 2014-11-11 12:17:22
不,它不是。請嘗試 console.log(ObjectId.isValid(9)); 並看看它是如何返回true,而它應該返回false。 – alexserver 2015-08-17 17:23:22
@alexserver這是一個有效的ID,實際上任何數字都可以工作。如果你必須驗證id是一個mongo生成的十六進制字符串,那麼你可以使用'(new RegExp(「^ [0-9a-fA-F] {24} $」))。test('53fbf4615c3b9f41c381b6a3')'在接受的答案。 – 2015-08-21 02:45:42
截至喬斯答案吃的延伸......這是有效的節點MongoDB的原生2.0
var objectID = require('mongodb').ObjectID
objectID.isValid('54edb381a13ec9142b9bb3537') - false
objectID.isValid('54edb381a13ec9142b9bb353') - true
objectID.isValid('54edb381a13ec9142b9bb35') - false
您可以使用Cerberus並創建一個自定義函數來驗證和OBJECTID
from cerberus import Validator
import re
class CustomValidator(Validator):
def _validate_type_objectid(self, field, value):
"""
Validation for `objectid` schema attribute.
:param field: field name.
:param value: field value.
"""
if not re.match('[a-f0-9]{24}', str(value)):
self._error(field, ERROR_BAD_TYPE % 'ObjectId')
## Initiate the class and validate the information
v = CustomValidator()
schema = {
'value': {'type': 'objectid'}
}
document = {
'value': ObjectId('5565d8adba02d54a4a78be95')
}
if not v(document, schema):
print 'Error'
這個答案適用於Python而不是nodejs。 – 2017-08-18 07:28:25
上面的正則表達式在'112345679065574883030833'的情況下給出了誤報爲什麼? – gabeno 2014-01-07 09:40:47
正則表達式將測試是否有字符串具有0到9或a到F.所以這個工作:'checkForHexRegExp.test(「112345679065574883030833」); true' - 'checkForHexRegExp.test(「000000000000000000000001」); true' - 'checkForHexRegExp.test(「FFFFFFFFFFFFFFFFFFFFFFFF」);真的' – 2014-01-07 13:13:28
好吧,所以看起來似乎沒有確定的方式來斷言一個真正的ObjectID。同樣的討論[這裏](http://stackoverflow.com/a/13851334/645458) – gabeno 2014-01-07 20:07:01