Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么可以';我在我的NodeJS应用程序中是否为自定义MongoDB\u id使用字符串uuid?_Node.js_Mongodb_Uuid_Monk - Fatal编程技术网

Node.js 为什么可以';我在我的NodeJS应用程序中是否为自定义MongoDB\u id使用字符串uuid?

Node.js 为什么可以';我在我的NodeJS应用程序中是否为自定义MongoDB\u id使用字符串uuid?,node.js,mongodb,uuid,monk,Node.js,Mongodb,Uuid,Monk,我正在开发一个带有MongoDB数据库的NodeJS应用程序(使用本机MongoDB NodeJS驱动程序),并希望使用字符串作为主键 当_id为字符串时,此插入失败: collection.insert({_id : "customId", name : "sampleName", email : "sampleEmail"}, {}, function(err, result) { if (err) { res.send({msg : err})

我正在开发一个带有MongoDB数据库的NodeJS应用程序(使用本机MongoDB NodeJS驱动程序),并希望使用字符串作为主键

当_id为字符串时,此插入失败:

   collection.insert({_id : "customId", name : "sampleName", email : "sampleEmail"}, {}, function(err, result) {
        if (err) {
            res.send({msg : err});
        }
        else {
            res.send({msg : 'SUCCESS'});
        }
    });
此代码在我的NodeJS应用程序中。当我在数据库上尝试通过mongoshell命令进行相同的插入时,效果很好

我知道MongoDB主键的自定义id字段必须保证是唯一的。我计划在代码中使用uuid字符串,但字符串id似乎不起作用。我在这里读到_id必须是唯一的,并且可以是除数组之外的任何类型。我也复习了这个类似的问题,但它并没有解决我的问题。为什么不能使用字符串作为自定义id字段

编辑:错误消息显示“[错误:传入的参数必须是12字节的单个字符串或24个十六进制字符的字符串]”

编辑2:

这是我的全部代码:

router.post('/addcontact', function(req, res) {
var db = req.db;
var newContact = req.body;
var newContactId = uuid.v4();
var newContactId = String(newContactId);
//newContact['_id'] = newContactId;
var collection = db.get('contactlist');
console.log("about to do insert");
try {
    collection.insert({_id : '4BF6EFC6-1682-4A40-A0DE-8CD104AC92D3', name : "testName", email : "testEmail", phone : "testPhone"}, {}, function(err, result){
        if (err) {
            res.send({msg : err});
        }
        else {
            res.send({msg : 'SUCCESS'});

            // log operation in log file with Kafka
            var producer = req.kafkaProducer;
            var payload = {topic : 'logging', messages: 'POST /addcontact id:' + newContactId + ' ' + newContact["name"]};
            producer.send([payload], function (err, data) {
            // console.log(data);
            });
        }
    });
}
catch (err) {
    console.log(err);
} });
请注意,我实际上并没有使用http POST中的新联系人信息,只是试图让一个示例插入生效

以下是控制台打印出的错误:

about to do insert
[Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters]
POST /contacts/addcontact - - ms - -
以下是我的package.json及其依赖项:

{
“名称”:“NodeApp2”,
“版本”:“0.0.0”,
“私人”:没错,
“脚本”:{
“开始”:“节点。/bin/www”
},
“依赖项”:{
“异步”:“.”,
“正文分析器”:“~1.13.2”,
“cookie解析器”:“~1.3.5”,
“couchbase”:“^2.1.2”,
“调试”:“~2.2.0”,
“快车”:“~4.13.1”,
“翡翠”:“~1.11.0”,
“卡夫卡节点”:“.”,
“kerberos”:“.*”,
“mongodb”:“2.0.49”,
“和尚”:“~1.0.1”,
“摩根”:“~1.6.1”,
“节点gyp”:“^3.1.0”,
“为favicon服务”:“~2.3.0”

}

因此您实际上不是直接使用,而是通过(
db.get('contactlist')
将其送出…)和
monk
自动将
\u id
强制转换为
ObjectId
,这就是为什么会出现该错误的原因


它看起来像是这种行为,因此您可能必须将代码迁移到
mongodb

monk
确实有一个选项,可以根据设置将uuid设置为您的
\u id
。简单地在options对象中将
castIds
设置为false

collection.insert(
    {_id: uuid, data: data},
    {castIds: false}
)

错误消息是怎么说的?错误是“[错误:传入的参数必须是一个12字节的字符串或一个24个十六进制字符的字符串]”@zacdoe根据您的评论,我认为有人试图将您的
customId设置为大小写
到需要12字节字符串的
对象ID
。@JohnnyHK我正在使用本机mongodb驱动程序。@zacdoe哪个版本?最新版本(2.0.49)不在乎你在
\u id
@DavidGrinberg中放了什么也许monk用户不想定义他们自己的
\u id
?:-)是的,我不是monk的粉丝。这太奇怪了。@robertklep其他Mongo驱动程序(至少是我知道的那些)但支持此功能-如果您不指定
\u id,将为其提供一个
you@DavidGrinberg我认为后者(“将为您提供一个”)满足了大多数用例,这对monk很好。只有当您想要提供非ObjectId(-ish)
\u id
时,您才会遇到麻烦。
collection.insert(
    {_id: uuid, data: data},
    {castIds: false}
)