流回调中的Mongoose findOne未执行

时间:2015-02-06 05:38:26

标签: javascript node.js mongodb mongoose

当我对不同于周围流的集合执行findOne查询时,它并不真正执行回调(1或2)。这是我的代码:

schema.js:

'use strict';

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var AutocompleteSchema = new Schema({
  nGram: String,
  locations: [{ type: Schema.Types.ObjectId, ref: 'Location' }]  
});

module.exports = mongoose.model('Autocomplete', AutocompleteSchema);

ingest.js:

var Autocomplete = require('./schema');
var nGramAPI = require('ngram');
var cache = [];
function storeNGram(input, location) {
    if(cache.indexOf(input) === -1) {
        cache.push(input);
        Autocomplete
        .findOne({ nGram: input })
        .populate('locations')
        .exec(function (err, nGram) {
        console.log(nGram);
            if(!nGram) {
                var newAutocomplete = {
                    nGram: input,
                    locations: [location._id]
                };
                Autocomplete.create(newAutocomplete, function(err, created) {
                    cache.splice(cache.indexOf(input), 1);
                });
            }
            else {
                nGram.locations.push(location._id);
                sortLocations(nGram);
                location.save(function(err, saved){
                    cache.splice(cache.indexOf(input), 1);
                });
            }
        }); 
    }
    else {
        setTimeout(function() {
            storeNGram(input, location);
        }, 100);
    }
}

exports.ingest = function() {
    console.log("Building nGrams");
    var stream = Location.find().stream();
    stream.on('data', function (location) {
        var length = location.dispName.length > 20 ? 20 : location.dispName.length;
        for(var i = 1; i <= length; i++) {
            _.each(nGramAPI(i)(location.dispName), function(nGram) {
                storeNGram(nGram, location);
            });
        }
    });
}

当我在流的外部执行Autocomplete.findOne时,它会正确查询,但是当它内部失败时。有什么建议吗?

0 个答案:

没有答案