2016-11-26 2 views
0

Я только что открыл nodeJS код пытается получить случайные документы из моей коллекции mongoose использования mongoose-random, но по какой-либо причине, когда я взываю к findRandom() методу, ответы 500.мангуст-случайный ответ 500

test.js

Здесь реветь я вставляю свой код:

var mongoose  = require('mongoose'); 
var random  = require('mongoose-random'); 
var Promise  = require('bluebird'); 

mongoose.Promise = Promise; 

var TestSchema = new mongoose.Schema({ 
    _id: { 
    type: Number, 
    default: 0 
    } 
}); 

TestSchema.plugin(random, {path: 'r'}); 

TestSchema.statics = { 
    start: function (value) { 
    var array = [], i = 1; 
    for (i; i < value; i += 1) { 
     array.push({ _id: i }); 
    } 
    return this.create(array); 
    }, 
    getRandom: function() { 
    return new Promise(function(resolve, reject) { 
     TestSchema.findRandom().limit(10).exec(function (err, songs) { 
     if (err) { 
      reject(err); 
     } else { 
      resolve(songs); 
     } 
     }); 
    }); 
    } 
}; 

module.exports = mongoose.model('TestSchema', TestSchema); 

routes.js

var router  = require('express').Router(); 
var path   = require('path'); 
var Promise  = require('bluebird'); 
var request  = require('request'); 

var test = require('./models/test.js'); 

router.get('/fill', function (req, res) { 
    test.start(40) 
    .then(function() { 
     res.status(200).send('You can start your hack :)'); 
    }) 
    .catch(function (error) { 
     res.status(400).send(error); 
    }); 
}); 

router.get('/vote', function (req, res) { 
    test.getRandom() 
    .then(function (data) { 
     res.status(200).send(data); 
    }) 
    .catch(function (error) { 
     res.status(400).send(error); 
    }); 
}); 

module.exports = router; 

Чтение другой пост here в качестве целей решения для использования syncRandom() метод, но это не работает для меня. Не используется random()

Любая помощь? Спасибо, совет.

UPDATE

Копает больше в этот вопрос, я realiced ​​моей модели TestSchema, которая должна содержать mongoose-random метод в настоящее время перекрытых, поэтому у меня есть только мои методы статики.

+0

Ваша проблема не в мангусте. 'this' в рамках обещания' getRandom' не относится к модели, это относится к функции в 'new Promise'. В этом контексте 'findRandom' не определен. – cdbajorin

+0

Да, извините, это была моя ошибка, когда я редактировал последний раз. – DevStarlight

+1

Если ваш сервер MongoDB не менее 3,2, вам, вероятно, лучше использовать встроенную ['$ sample'] (https://docs.mongodb.com/manual/reference/operator/aggregation/sample/#pipe ._S_sample). – JohnnyHK

ответ

1

Не устанавливайте statics на новый объект, просто добавить методы к нему:

TestSchema.statics.start = function (value) { 
    var array = [], i = 1; 
    for (i; i < value; i += 1) { 
     array.push({ _id: i }); 
    } 
    return this.create(array); 
    }; 

TestSchema.statics.getRandom = function() { 
    return new Promise(function(resolve, reject) { 
     TestSchema.findRandom().limit(10).exec(function (err, songs) { 
     if (err) { 
      reject(err); 
     } else { 
      resolve(songs); 
     } 
     }); 
    }); 
    }; 

Однако, если ваш сервер MongoDB, по крайней мере 3,2, вы, вероятно, лучше использовать встроенный в $sample оператора трубопровода вместо плагина для выбора случайных документов.

test.aggregate([{$sample: 10}], callback); 
Смежные вопросы