2016-11-26 82 views
0

我剛剛開了一個nodeJS代碼試圖利用mongoose-randommongoose收集一些隨機的文件,但是當我打電話給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方法被overrided,所以我只有我的靜態方法。

+0

您的問題沒有貓鼬。在'getRandom'的承諾範圍內的'this'不是指模型,而是指'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);