Я новичок в Mongoose. Я написал метод статики и метод экземпляра для схемы Mongoose с именем questionSchema и экспортировал их следующим образом:
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 я импортировал его как модель и попытался вызвать статический метод, который должен вернуть все документы в рамках модели вопроса:
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, что
'If you don't specify a callback then the API will return a variable of type Query.'
Я указал обратный вызов, но все же получил объект Query. Прежде всего, правильно ли я использую свои статические методы и методы экземпляра? Документы вообще сохраняются? И как мне получить доступ к сохраненным документам массива?





Если вы используете Node 8.x, вы можете использовать асинхронный / ожидание
Таким образом ваш код будет выглядеть более синхронным:
questionSchema.statics.getAllQ = async () => {
return await this.find({});
}
router.get('/qcrud/getAll',async (req, res) => {
let qArr = await Question.getAllQ();
res.send(qArr);
});
Вы можете найти действительно хорошую статью, в которой объясняется, как использовать Mongoose с async / await здесь.
Что ж, это означает, что ваш метод сохранения работает некорректно, потому что в базе данных ничего нет. Возможно, вам стоит попробовать проверить этот метод. По ссылке, которую я включил в ответ, у вас есть пример, как вы можете использовать await / async с save
Но явно написано здесь, чтобы не объявлять статику с помощью стрелочных функций ES6: «Не объявляйте статику с помощью стрелочных функций ES6 (=>). Стрелочные функции явно предотвращают привязку this, поэтому приведенные выше примеры не будут работать из-за значения this».
Если это возвращает для меня пустой массив [], означает ли это, что мои документы не были сохранены? Нужно ли мне затем использовать async await для сохранения?