【发布时间】:2014-09-04 04:44:25
【问题描述】:
以下是相关代码:
var Results = mongoose.model('Results', resultsSchema);
var results_array = [];
_.each(matches, function(match) {
var results = new Results({
id: match.match_id,
... // more attributes
});
results_array.push(results);
});
callback(results_array);
});
}
], function(results_array) {
results_array.insert(function(err) {
// error handling
当然,我会得到一个No method found 对应的results_array。但是我不确定还有什么可以调用该方法。
在其他函数中,我在这里传递了与 results 变量等效的变量,它是一个猫鼬对象,并且具有可用的 insert 方法。
如何在此处插入文档数组?
** 编辑 **
function(results_array) {
async.eachLimit(results_array, 20, function(result, callback) {
result.save(function(err) {
callback(err);
});
}, function(err) {
if (err) {
if (err.code == 11000) {
return res.status(409);
}
return next(err);
}
res.status(200).end();
});
});
那么发生了什么:
当我清除集合时,这工作正常。 但是,当我重新发送此请求时,我从未收到任何回复。
发生这种情况是因为我的架构不允许来自 JSON 响应的重复项。因此,当我重新发送请求时,它会获得与第一个请求相同的数据,因此会以错误响应。这就是我认为状态码409 处理的内容。
在我的实现中是否有错字?
编辑 2
错误代码出来了:
{ [MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index:
test.results.$_id_ dup key: { : 1931559 }]
name: 'MongoError',
code: 11000,
err: 'insertDocument :: caused by :: 11000 E11000 duplicate key error index:
test.results.$_id_ dup key: { : 1931559 }' }
所以这正如预期的那样。 Mongo 响应 11000 错误,抱怨这是一个重复的键。
编辑 3
if (err.code == 11000) {
return res.status(409).end();
}
这似乎解决了问题。这是一个创可贴吗?
【问题讨论】:
-
你到底想做什么?是否有另一个模型具有包含结果数组的文档?还是您想一次插入一大堆“结果”文档?
-
您不能将
return与回调混用。 console.log(err) 看看会发生什么。与 err.code 和其他可能与您预期不匹配的内容相同。但肯定会在此处重复键,这适用于空集合。 -
在细节中进行了编辑,但错误代码与我预期的一样。我只是不确定在这种情况下
return的替代方案是什么。我想说的是,当错误代码为11000时,使用409代码或适当的代码进行响应并结束请求/响应周期。目前没有发生这种情况,我不确定具体原因。 -
这里的提示是您要问的问题不止一个。回答了一部分,即如何插入您的文档数组。现在你在问如何使用 express 这真的是另一个问题。但基本上你应该只想要
res.status(409).end()而你不要在这些东西前面加上return -
啊我的错。我是新来的,只是想学习一些技巧。不过,这不是借口,我会尝试拿起我的游戏。是的,这解决了我的问题,谢谢尼尔。
标签: javascript node.js mongodb mongodb-query