为什么返回未定义?

时间:2018-09-02 06:54:29

标签: node.js function promise

所以我有两个文件,server.jsdb.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 :(得分:2)

代码中有很多不良做法,我将尝试涵盖一些。

  1. 您的db.js文件在需要时立即触发异步操作。
  2. 您没有从db.js文件中返回Promise,因此您的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文件中,我正在等待建立异步连接,然后再提起应用程序,这样我就知道我的应用程序在投放时处于就绪状态,并且{ {1}}种方法可立即用于我的应用。

答案 1 :(得分:1)

由于您的承诺尚未兑现,您将变得不确定。尝试使用异步功能,然后等待您的数据库操作完成。参见working with async funtions。您还可以尝试将mongoose对象建模用作mongodb客户端。