Почему он возвращает неопределенное? - PullRequest
0 голосов
/ 02 сентября 2018

Итак, у меня есть два файла, server.js и db.js Теперь вот код, с которым у меня проблема:

server.js :
var DB = require('./db')
app.get("/test", (req, res) => {
console.log(DB.getPostAll())
})

db.js :
MongoClient.connect(uri, { useNewUrlParser: true })
.then(function (db) {
    console.log("Connected")
    var dbo = db.db('test')

    module.exports.getPostAll = function getPostAll() {
        return (
            dbo.collection('posts').find({}).toArray(function (err, res) {
                if (err) throw err;
                else return res
            })
        )
    }
})
.catch(function (err) {

})

Извините за глупый вопрос. Но кто-нибудь может сказать, что я здесь делаю не так? Я пытаюсь использовать два возврата. До этого я пытался использовать переменную вместо возвратов в db.js getPostAll. Но он также возвращает undefined.

Ответы [ 2 ]

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

В коде много плохих практик, я попытаюсь рассказать о них.

  1. Ваш файл db.js запускает асинхронное действие в тот момент, когда оно требуется.
  2. Вы не возвращаете Promise из файла db.js, поэтому ваш файл server.js начинает выполнять код, не зная, было ли соединение с БД выполнено / ожидает или отклонено
  3. Вы экспортируете метод после выполнения функции, это приводит ко многим странным и неожиданным побочным эффектам. Лучше всего определять все ваши экспорты на верхнем уровне файла.

Самый простой способ решить вашу проблему:

server.js :
const connectDB = require('./db')
connectDB().then((db) => {
   app.get("/test", (req, res) => {
      console.log(db.getPostAll())
   })
   app.listen(...); // lift the server ONLY when the db is connected
});

db.js :
module.exports = function connectDB() {
   return MongoClient.connect(uri, { useNewUrlParser: true })
   .then(function (db) {
       console.log("Connected")
       var dbo = db.db('test')
       return {
          getPostAll() {
             return dbo.collection('posts').find({}).toArray()
          }
       }
  })
}

В файле db.js я экспортирую функцию, которая возвращает обещание. Таким образом, я могу сказать, когда соединение установлено (после разрешения обещания), он возвращает объект со всеми необходимыми вам методами db ( getPostAll).

В файле server.js я ожидаю установления асинхронного соединения перед тем, как поднять приложение, поэтому я знаю, что мое приложение находится в состоянии готовности, когда оно обслуживается, и у меня есть db методы легко доступны для моего приложения.

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

Вы получаете неопределенный, поскольку ваше обещание не выполнено. Попробуйте использовать асинхронную функцию и дождитесь окончания операции db. См. Работа с асинхронными функциями . Вы также можете попробовать mongoose моделирование объектов в качестве клиента mongodb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...