所以我使用MongoJS搞乱MongoDB,并且当存在唯一ID时,似乎无法返回错误。
所以这是我正在使用的代码:
server.post('/register', function (req, res, next) {
var details = req.params;
details.password = md5(details.password).toString();
db.users.insert(details,
function (err, test1, test2) {
console.log(err);
});
});
所以我用username = username& password = password命中/注册,最初将它添加到数据库中。如果我再次访问相同的网址,即使我在MongoLab中设置了以下内容,我也不会收到任何已存在该用户名条目的错误:
{
"v": 1,
"unique": true,
"key": {
"username": 1
},
"name": "username",
"ns": "restapi.users",
"background": true
}
我需要做些什么来解决“错误”问题。为重复输入返回正确的错误代码?我相信它应该返回11000。
由于
答案 0 :(得分:1)
这似乎是来自mongojs的“错误”响应,这可能是因为它实现了将“插入”对象作为响应返回。 “核心”驱动程序不会执行此操作,但会返回“ok”响应或错误:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost/test', function(err,db) {
var collection = db.collection('users');
collection.insert({ "username": 2 },function(err,res) {
if (err) throw err;
console.log( res );
});
});
因此,在尝试对API行为进行此更改时,似乎mongojs
“将此问题搞砸了”。因此,Bulk操作的错误也未正确报告。但至少你可以得到一个回复,告诉你确定没有插入任何内容:
var mongojs = require('mongojs'),
db = mongojs('test');
var collection = db.collection('users')
var bulk = collection.initializeOrderedBulkOp();
bulk.insert({ "username": 2 });
bulk.execute(function(err,res) {
if (err) throw err;
console.log( res );
});
如果用户名存在,则响应为:
{ writeErrors: [],
writeConcernErrors: [],
nInserted: 0,
nUpserted: 0,
nMatched: 0,
nModified: 0,
nRemoved: 0,
upserted: [],
ok: 1 }
如果它是一个新的“唯一”值,那么响应将是:
{ writeErrors: [],
writeConcernErrors: [],
nInserted: 1,
nUpserted: 0,
nMatched: 0,
nModified: 0,
nRemoved: 0,
upserted: [],
ok: 1 }
如果你想要至少一个新文档的_id
,我会说使用"upserts"进行批量操作,但那里的实现也被破坏了。实际上,monjojs
仍然完成的“包装”方法根本不包括使用“upserts”的任何选项。
所以你可以做的最后一件事是使用db
对象中的.runCommand()
方法并以这种方式处理“upsert”:
var mongojs = require('mongojs'),
db = mongojs('test');
db.runCommand(
{
"update": "users",
"updates": [
{
"q": { "username": 4 },
"u": { "$setOnInsert": { "username": 4 } },
"upsert": true
}
],
"ordered": true
},
function(err,res) {
if (err) throw err;
console.log( res );
}
);
它仍然不会报告重复键的错误(upserts不会这样做),但响应至少会告诉您相关信息。在“upsert”上,它会报告:
{ ok: 1,
nModified: 0,
n: 1,
upserted: [ { index: 0, _id: 5580da465e2076d9ea0c5885 } ] }
如果找到值并且由于$setOnInsert
因此未修改数据,则响应将为:
{ ok: 1, nModified: 0, n: 1 }
因此,如果您仍然要使用mongojs
,那么您需要接受这些限制并解决这些问题。