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。我甚至不知道它可以这样工作。