节点无法识别重复的条目

时间:2015-10-21 10:13:18

标签: node.js mongoose

我正在尝试创建一个基本的MEAN堆栈CRUD api,以便将商店添加到我的数据库中。我希望每个商店都有一个独特的名称(以避免添加重复项)。到目前为止,即使我发布了10次相同的请求,一切都会保存到数据库中。通过代码几次,无法弄清楚错误,如果有人能指出我正确的方向,我将非常感激。

店铺模特:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt-nodejs');

//shop schema
var ShopSchema = new Schema({
    name: { type: String, required: true, index: { unique: true }},
    address: { type: String, required: true, index: { unique: true }}
});

module.exports = mongoose.model('Shop', ShopSchema);

发布功能:

apiRouter.route('/shops')
    //create a shop
    .post(function(req, res) {
        //new instance of shop model
        var shop = new Shop();
        //set the shop information
        shop.name = req.body.name;
        shop.address = req.body.address;
        //save shop and check for errors
        shop.save(function(err) {
            if(err) {
                //duplicate entry
                if(err.code == 11000) {
                    return res.json({ success: false, message: 'A shop with that name already exists.'});
                }
                else {
                    return res.send(err);
                }
            }
            else {
                res.json({ message:'Shop created! '});
            }
        });
    })

我没有收到任何类型的错误,就像我说的所有内容都被写入数据库。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

基本上,您的写入在保存新条目之前尚未完成。您可以阅读有关创建唯一键Here的更多信息,但要点如下。解决方案是提前在唯一字段上创建索引。

  

当我们声明一个属性是唯一的时,我们实际上声明我们想要该属性的数据库级索引。某些数据库抽象层将发出查询,以查看是否存在具有相同唯一属性值的另一条记录,如果该查询返回空,则允许保存或更新继续进行。如果你相信这种方法,你要么拥有令人难以置信的低流量,要么你将要了解竞争条件,因为在任何写入结束之前,有两个或更多请求可以对数据库进行检查,并且你最终会得到非唯一的数据库中的数据。

     

在检查查询发出的时间之间,另一个插入可能会出现完全相同的事情,并且您最终仍然会重复。无法在应用程序级别正确验证唯一性。所以Mongoose试图为我们创建一个索引是好的。