Javascript Node.js&;MongoDB:为什么db对象未定义?
我正在使用Node.js和MongoDB本机驱动程序() 我想从Javascript Node.js&;MongoDB:为什么db对象未定义?,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在使用Node.js和MongoDB本机驱动程序() 我想从server.js中的处理程序中的db.js访问get()方法返回的db对象 db.js server.js 问题是Db.get()返回未定义的 现在考虑这个代码代替: const Db = require('./db') const server = new Hapi.Server() ... server.route({ method: 'GET', path: '/', handler: (req, rep)
server.js
中的处理程序中的db.js
访问get()方法返回的db对象
db.js
server.js
问题是Db.get()
返回未定义的
现在考虑这个代码代替:
const Db = require('./db')
const server = new Hapi.Server()
...
server.route({
method: 'GET',
path: '/',
handler: (req, rep) => {
const _db = Db.get()
console.log(_db) // the _db object exists
}
})
我不明白为什么调用get()方法时第一个代码返回未定义,并且应该将实例存储到
\u db
中,这样就可以在handler函数中访问。在传递给的函数中分配\u db
,然后在一个Promise的中分配,本部分的执行推迟到某个时间点,直到承诺得到解决。server.route
是同步的。这意味着它很可能在承诺得到解决之前执行
要使其发挥作用,请等待承诺得到解决:
'use strict'
const MongoClient = require('mongodb').MongoClient
let _db
async function connect (url) {
try {
return await MongoClient.connect(url, { server: { poolSize: 5 } })
} catch (error) {
throw new Error('Could not connect to Mongo instance');
}
}
async function get () {
return _db ? _db : await connect();
}
async function close () {
if (_db) {
console.log('Closing MongoDB connection.')
_db.close()
}
}
module.exports = {
connect,
close,
get
}
然后
'use strict'
const Hapi = require('hapi')
const Db = require('./db')
const _db = await Db.get()
const server = new Hapi.Server()
server.connection({
host: 'localhost',
port: 8080
})
server.route({
method: 'GET',
path: '/',
handler: async (req, rep) => {
const _db = await Db.get();
console.log(_db) // _db will be guaranteed to be a valid object, otherwise an error will be thrown
}
})
Db.connect('mongodb://localhost:27017/test')
.then(() => {
server.start((err) => {
if (err) {
throw err
}
console.log(`Server running at: ${server.info.uri}`)
})
})
.catch((e) => {
console.error(`${e.name}: ${e.message}`)
return
})
阅读更多有关async/await和的信息。谢谢你。我理解它未定义的原因。但是,您的异步/等待代码与我的上一个代码片段有什么不同。只需在我的路由处理程序中移动const\u db=db.get()
就可以了,无需任何其他修改。在您的代码中,const\u db=await db.get()
仍在路由处理程序中。这是否意味着db实例应始终像我的第一个代码段中那样声明,而无法像我的第一个代码段中那样在外部声明?这是否意味着db实例应始终像这样声明-->我的意思是应在每个路由处理程序中声明?
'use strict'
const MongoClient = require('mongodb').MongoClient
let _db
async function connect (url) {
try {
return await MongoClient.connect(url, { server: { poolSize: 5 } })
} catch (error) {
throw new Error('Could not connect to Mongo instance');
}
}
async function get () {
return _db ? _db : await connect();
}
async function close () {
if (_db) {
console.log('Closing MongoDB connection.')
_db.close()
}
}
module.exports = {
connect,
close,
get
}
'use strict'
const Hapi = require('hapi')
const Db = require('./db')
const _db = await Db.get()
const server = new Hapi.Server()
server.connection({
host: 'localhost',
port: 8080
})
server.route({
method: 'GET',
path: '/',
handler: async (req, rep) => {
const _db = await Db.get();
console.log(_db) // _db will be guaranteed to be a valid object, otherwise an error will be thrown
}
})
Db.connect('mongodb://localhost:27017/test')
.then(() => {
server.start((err) => {
if (err) {
throw err
}
console.log(`Server running at: ${server.info.uri}`)
})
})
.catch((e) => {
console.error(`${e.name}: ${e.message}`)
return
})