2012-08-16 83 views
34

如何檢查的對象ID是否有效利用節點的司機MongoDB的節點檢查,如果OBJECTID有效

我想:

var BSON = mongo.BSONPure; 
console.log("Validity: " + BSON.ObjectID.isValid('ddsd')) 

但我不斷收到一個例外,而不是真或假。 (唯一的例外是隻是一個「扔é; // process.nextTick錯誤,或‘錯誤’的第一跳事件」

回答

50

不知道其中isValid()功能來源於但它不是在node-mongodb-native

,你可以。如果你想檢查的24進制字符的字符串使用正則表達式。

var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$"); 

github.com/mongodb/js-bson/.../objectid.js

+0

上面的正則表達式在'112345679065574883030833'的情況下給出了誤報爲什麼? – gabeno 2014-01-07 09:40:47

+0

正則表達式將測試是否有字符串具有0到9或a到F.所以這個工作:'checkForHexRegExp.test(「112345679065574883030833」); true' - 'checkForHexRegExp.test(「000000000000000000000001」); true' - 'checkForHexRegExp.test(「FFFFFFFFFFFFFFFFFFFFFFFF」);真的' – 2014-01-07 13:13:28

+0

好吧,所以看起來似乎沒有確定的方式來斷言一個真正的ObjectID。同樣的討論[這裏](http://stackoverflow.com/a/13851334/645458) – gabeno 2014-01-07 20:07:01

10

@ 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; 
} 
+0

你似乎誤解了一個12字節的ObjectID意味着什麼。這是id的二進制(而非十六進制)表示 - 因此,大多數格式的id將會通過測試(任何12個字節形成一個有效的ObjectID)。 – 2014-05-13 20:24:45

7

我已提交的上拉請求,其公開了一個的isValid方法的JS-BSON庫,作爲邏輯來檢查的objectid串已經在那裏。

+0

請鏈接到您的拉請求,謝謝。 – frontsidebus 2014-02-16 04:35:31

+1

https://github.com/mongodb/js-bson/pull/65 – Mandy 2014-03-20 11:17:31

23

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')); 
+1

這是真正的解決方案,謝謝:) – 2014-11-11 12:17:22

+0

不,它不是。請嘗試 console.log(ObjectId.isValid(9)); 並看看它是如何返回true,而它應該返回false。 – alexserver 2015-08-17 17:23:22

+2

@alexserver這是一個有效的ID,實際上任何數字都可以工作。如果你必須驗證id是一個mongo生成的十六進制字符串,那麼你可以使用'(new RegExp(「^ [0-9a-fA-F] {24} $」))。test('53fbf4615c3b9f41c381b6a3')'在接受的答案。 – 2015-08-21 02:45:42

11

截至喬斯答案吃的延伸......這是有效的節點MongoDB的原生2.0

var objectID = require('mongodb').ObjectID 

objectID.isValid('54edb381a13ec9142b9bb3537') - false 
objectID.isValid('54edb381a13ec9142b9bb353') - true 
objectID.isValid('54edb381a13ec9142b9bb35') - false 
-1

您可以使用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' 
+3

這個答案適用於Python而不是nodejs。 – 2017-08-18 07:28:25