Почему я не могу вывести результат с console.log из Model.find () Mogoose? - PullRequest
0 голосов
/ 14 сентября 2018

Итак, я работал над MongoDB с mongoose, и у меня есть следующий код, который будет включен с var tdb = require('./db.js');

// ./db.js
module.exports = {
    update: function(data) {
        post.findOne({slug:data.slug}, (err, res) => {
            if(err) {
                post.create(data, (err, res) => {})
            } else {
                post.updateOne({slug:data.slug}, data, (err, res) => {})
            }
        })
    },
    search: function(ftype, fval, fkey) {
        var query = {};
        if(ftype != "all") {
            query[ftype] = fval;
        }
        post.find(query).lean().exec((err, res) => {
            var keys = Object.keys(res);
            var index = keys.indexOf(fkey);
            var rdata = res[fkey];
            rdata.next = res[keys[index + 1]];
            rdata.prev = res[keys[index - 1]];
            return rdata;
        })
    }
}

(код также имеет другую часть, ноЯ сосредотачиваюсь на search функции)

Который затем я пытаюсь вызвать console.log(tdb.search("all", "none", "2"));, но он выдает undefined.Но если я добавлю console.log(rdata) над строкой возврата, он выдаст правильный ответ, в то время как код console.log(tdb.search("all", "none", "2")); все еще возвращает undefined.

Я понятия не имею, почему.Я подумал об одной вероятной проблеме, заключающейся в том, что порядок обработки неверен, что произошло с fs и исправлено с помощью обещания.Но я не думаю, что это так, так как я возвращаю значение в обратном вызове post.find(), чем я полностью застрял.Не знаете, где другие могут пойти не так?

1 Ответ

0 голосов
/ 14 сентября 2018

Ваша функция search ничего не возвращает, поэтому она будет undefined по умолчанию.

Также find является асинхронным.Если вы удалите обратный вызов из exec , то он должен вернуть обещание.Затем вы можете вместо этого связать , затем и вернуть это обещание:

search: function(ftype, fval, fkey) {
  var query = {};
  if (ftype != "all") {
    query[ftype] = fval;
  }

  return post
    .find(query)
    .lean()
    .exec()
    .then(res => {
      var keys = Object.keys(res);
      var index = keys.indexOf(fkey);
      var rdata = res[fkey];
      rdata.next = res[keys[index + 1]];
      rdata.prev = res[keys[index - 1]];
      return rdata;
    });
}

... и тогда вы сможете записать результат, когда обещание разрешается с использованием then :

tdb
  .search("all", "none", "2")
  .then(data => console.log(data));

Еще один способ сделать это - передать функцию обратного вызова в функцию search , а затем вызвать ее с данными, когда они будут готовы:

search: function(ftype, fval, fkey, callback) {
  var query = {};
  if (ftype != "all") {
    query[ftype] = fval;
  }

  post.find(query).lean().exec((err, res) => {
    var keys = Object.keys(res);
    var index = keys.indexOf(fkey);
    var rdata = res[fkey];
    rdata.next = res[keys[index + 1]];
    rdata.prev = res[keys[index - 1]];

    callback(rdata);
  });
}

... и тогда вы сможете записать результат с помощью функции обратного вызова:

tdb.search("all", "none", "2", (data) => {
  console.log(data);
});

Надеюсь, это поможет.

...