Node.js nodejs:如何生成schema.pre('save',…)唯一字段

Node.js nodejs:如何生成schema.pre('save',…)唯一字段,node.js,mongoose,unique,Node.js,Mongoose,Unique,我在mongoose上注册了用户,我需要根据可能的值生成唯一的随机标识字段。问题是我无法查询mongodb 控制台中脚本的结果是1。就这样。 那么,错误在哪里呢?有没有更好的方法来生成唯一的随机场/数字 schemaUser.pre('save', function (next) { var self = this; function genIdent() { var ident = "", possible = "013456789"; f

我在mongoose上注册了用户,我需要根据可能的值生成唯一的随机标识字段。问题是我无法查询mongodb

控制台中脚本的结果是1。就这样。 那么,错误在哪里呢?有没有更好的方法来生成唯一的随机场/数字

schemaUser.pre('save', function (next) {

    var self = this;

    function genIdent() {
        var ident = "", possible = "013456789";

        for(var i=1; i <= 5; i++)
            ident += possible.charAt(Math.floor(Math.random() * possible.length));

        return ident;
    }

    function doIt() {
        var ident = genIdent();

        console.log('ONE');

        mongoose.model('User', schemaUser).findOne({ident: ident}, function(err, o) {
            console.log('TWO');
            if (o) {
                doIt();
            } else {
                self.ident = ident;
                next();
            }
        });

    }

    doIt();

});

看起来您只是在生成ident,但并没有将其放入MongoDB中,并试图在保存它之前在其中找到它

要使用该标识访问文档,您需要先保存它


请尝试放置console.logerr以查看返回的错误

谢谢您的回答。正如我所说,line console.log'TWO';无法访问。我尝试运行您的代码,但它实际上进入了用于搜索的回调函数中的“else”部分。也许它不是在打印'2',因为它在if内部?因为节点是异步的,所以这是可能的。尝试仅将console.log放入“if”和“else”中。查看它打印的内容您只能调用mongoose.model'User',schemaUser一次,因为它定义了模型的模式。