如何在Mongoose中编写可获取所有文档的静态方法?

时间:2018-12-14 23:37:49

标签: node.js express mongoose mongoose-schema

我是猫鼬的新手。我为名为“ questionSchema”的Mongoose模式编写了一个静态方法和一个实例方法,并像这样导出它:

var questionSchema = new Schema({
    ...
})

questionSchema.methods.createQuestion = function(){
    return this.save(function(err){
        if(err){ 
            return  err
        };
        return 'Saved the question';
    });
};

questionSchema.statics.getAllQ = function(){
    return this.find({}, function(err, res){
        if(err){ 
            return  err
        };
        return res;
    });
}

module.exports = mongoose.model('Question', questionSchema)

然后在Node / Express服务器的路由中,将其作为模型导入,并尝试调用static方法,该方法应返回Question模型下的所有文档:

const Question = require('../models/question.js');

...

router.post('/qcrud/submit', (req, res) => {
    let reqBody = req.body;

    var newQuestion = new Question({reqBody});    
    newQuestion.createQuestion();
})

router.get('/qcrud/getAll',(req, res) => {
    let qArr = Question.getAllQ()
    res.send(qArr);
});

但是,它返回一个Query对象,而不是我期望的数组。我环顾四周,在MDN上看到

  

'如果您未指定回调,则API将返回变量   Query类型。”

我确实指定了一个回调,但是仍然得到了Query对象。首先,我使用静态方法和实例方法对吗?文件是否保存?以及如何访问保存的阵列文档?

1 个答案:

答案 0 :(得分:1)

如果您使用的是Node 8.x,则可以使用async/await

这样,您的代码将看起来更加同步:

questionSchema.statics.getAllQ = async () => {
    return await this.find({});
}

router.get('/qcrud/getAll',async (req, res) => {
    let qArr = await Question.getAllQ();
    res.send(qArr);
});

您会发现一篇非常不错的文章,它解释了如何将Mongoose与异步/等待here一起使用。