Javascript Node.js&;MongoDB:为什么db对象未定义?

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)

我正在使用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) => {
    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
})