Node.js&MongoDB:为什么数据库对象未定义
Node.js & MongoDB: why the db object is undefined?
我使用的是Node.js、Hapi和MongoDB Native Driver(Node MongoDB Native(
我想访问server.js
中处理程序中db.js
的get((方法返回的db对象。
db.js
'use strict'
const MongoClient = require('mongodb').MongoClient
let _db
function connect (url) {
return MongoClient.connect(url, { server: { poolSize: 5 } })
.then((db) => {
_db = db
console.log('Connected to MongoDB:', db.s.databaseName)
})
.catch((e) => {
throw e
})
}
function get () {
return _db
}
function close () {
if (_db) {
console.log('Closing MongoDB connection.')
_db.close()
}
}
module.exports = {
connect,
close,
get
}
server.js
'use strict'
const Hapi = require('hapi')
const Db = require('./db')
const _db = Db.get()
const server = new Hapi.Server()
server.connection({
host: 'localhost',
port: 8080
})
server.route({
method: 'GET',
path: '/',
handler: (req, rep) => {
console.log(_db) // _db is undefined
}
})
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
})
问题是Db.get()
返回undefined
。
现在考虑这个代码:
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((方法时返回undefined,并且应该将实例存储到_db
中,以便在处理程序函数中访问。
在传递给Promise的then
的函数中分配_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的信息。
相关文章:
- 为什么 Javascript 和 AJAX 调用(在页面加载时)会导致数据库行为空?(脸书画布)
- 为什么我从一个空的mongodb数据库中获取数据
- 为什么我可以添加一个新主题,但我可以't向SQLite数据库添加新注释
- 为什么Meteor在刷新后会复制数据库对象
- 为什么除了数据库(WebSQL)之外,其他数据库名称在android中不起作用
- 为什么我的 ajax 调用不将数据存储在数据库中?没有 PHP 或控制台错误
- 为什么我的按钮没有将数据发布到我的 mysql 数据库
- 为什么我的脚本只将最后一个图像上传到我的 FTP 和数据库
- 为什么CodeMirror编辑器的输入值可以'无法保存到数据库中
- 为什么没有将新条目插入数据库
- 为什么我的数据库对象的集合为空
- 为什么不刷新就提交表单而不添加数据库值
- 当我从数据库中检索值时,为什么Parse中的链式函数不起作用
- 为什么我不需要在Sails.js控制器函数中调用next,即使它在其主体中有一个(异步的?)数据库查询
- 为什么这个表单不调用JS函数?(试图获得一个自动完成的表单字段调用MySQL数据库与PHP脚本和AJAX)
- Node.js&MongoDB:为什么数据库对象未定义
- 为什么我得到一个未定义的,当我试图访问数据库.集合
- 为什么JavaScript查询的结果总是成功的,即使用户不存在于parse.com数据库
- 根据IndexedDB规范,为什么在调用IndexedDB . deletedatabase时关闭打开的数据库连接?
- 为什么Laravel上的AJAX GET/POST会“;内部服务器错误”;当我尝试将数据用于数据库请求时