Node.js 为什么返回未定义?

Node.js 为什么返回未定义?,node.js,function,promise,Node.js,Function,Promise,所以我有两个文件,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("Connect

所以我有两个文件,
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
中使用一个变量来代替返回值。但是它也会返回未定义的

,因为您的承诺没有得到解决,所以您正在得到未定义。尝试使用异步函数并等待db操作完成。看见您也可以尝试将对象建模作为您的mongodb客户端。

代码中有很多错误做法,我将尝试介绍一些

  • 您的
    db.js
    文件在需要时触发异步操作
  • 您没有从
    db.js
    文件返回承诺,因此您的
    server.js
    文件开始执行代码,而不知道与db的连接是否已完成/挂起或被拒绝
  • 在执行函数后导出方法,这会导致许多奇怪和意外的副作用。最好在文件的顶层定义所有导出
  • 解决问题的最简单方法是:

    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
    方法。

    我明白了。谢谢你的回答。关于你的部分问题,请阅读超级聪明的Woah。我甚至不知道它可以这样工作。