Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步等待和共享MongoDB连接_Javascript_Node.js_Mongodb_Express - Fatal编程技术网

Javascript 异步等待和共享MongoDB连接

Javascript 异步等待和共享MongoDB连接,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我目前正在使用Express和MongoDB本机节点构建后端。我一直在研究,试图找到管理Mongo数据库连接并在应用程序中使用该连接的最佳“最佳实践”。 我目前的解决方案是工作,我得到了预期的结果,通过测试邮递员。在处理MongoDB3.x(没有Mongoose)和模块化的连接时,我找不到具体的答案 有人愿意就我当前的解决方案提供一些反馈吗? 我主要担心的是,此设置将无法执行。我怀疑可能不是,可能是因为频繁打开/关闭连接,但我不确定我这样做是好是坏 我创建了一个db.js文件来服务我的连接: c

我目前正在使用Express和MongoDB本机节点构建后端。我一直在研究,试图找到管理Mongo数据库连接并在应用程序中使用该连接的最佳“最佳实践”。 我目前的解决方案是工作,我得到了预期的结果,通过测试邮递员。在处理MongoDB3.x(没有Mongoose)和模块化的连接时,我找不到具体的答案

有人愿意就我当前的解决方案提供一些反馈吗?

我主要担心的是,此设置将无法执行。我怀疑可能不是,可能是因为频繁打开/关闭连接,但我不确定我这样做是好是坏

我创建了一个
db.js
文件来服务我的连接:

const assert = require("assert");
const MongoClient = require("mongodb").MongoClient;
const base = process.env.PWD;
const config = require(base + "/config");
let db;
let client;


const connect = async () => {
  const url = config.url
  const dbName = config.dbName
  client = await MongoClient.connect(url)
  db = await client.db(dbName)
  return db
}

const disconnect = () => {
  client.close()
}

module.exports = {
  connect: connect,
  disconnect: disconnect
  }
然后,我在我的todos文件夹的
index.js
中为我的“todos”设置路由。按照最佳做法,将所有组件文件放在各自的文件夹中(打开以获得有关文件夹结构的反馈):

最后是实际的
todosController.js
,它需要
db.js
这是我怀疑会发生一些改进的地方,但我只是不确定。我通过异步功能在路由内连接,等待连接并将其分配给
db
我执行CRUD查询(所有查询当前都正常工作),然后在最后断开连接。 如果这被认为是性能和良好的实践,我对这个答案很满意,但如果有一种方法可以更好地使用当前的驱动程序和语法,我会很高兴得到任何反馈

'use strict';

const base = process.env.PWD,
      client = require(base + '/db.js'),
      assert = require('assert')

let db

const getTodos = async (req, res) => {
  db = await client.connect()
  const collection = await db.collection('documents')
  // Find all todos
  collection.find({}).toArray((err, todos) => {
    assert.equal(err, null)
    res.status(200).json(todos)
  })
  client.disconnect()
}

似乎这是一种常见的误解,即在每次请求时打开和关闭连接更有效。打开连接很昂贵,这是存在连接池的原因之一。MangGDB支持这些,你应该考虑它们。 关于Express/MongoDB连接处理问题,从以下内容开始:

开发人员在连接到数据库时的一个常见错误是 在每个路由处理程序中调用MongoClient.connect()以获取数据库 连接


我认为我对一个类似问题的回答可能很有用:我喜欢这个解决方案,但在尝试实现时遇到了一些问题。为了使事情模块化,我的项目目前使用服务器的方法。我有一个路由文件,需要控制器进行db查询。使用这种方法,如果我将路由及其功能的使用限制为app.js(或www)和单个文件,以避免像那篇文章所建议的那样需要dbs,那么我可以让一切都正常工作。这似乎使文件变得笨重,模块化程度降低,这种方法有缺点吗?这种方法的要点是已经建立了数据库连接,并通过
require
传递。它最终的行为几乎像一个
单例
,因为如果节点已经获得该文件一次,它就不需要再次访问。它实际上与笨重的相反,因为你现在可以自由地索取一次并在任何地方使用它,唯一的价格是单一的
require(db)
。哦!!那就更有意义了!我真的很感谢你分享你的初步答案和后续行动。
'use strict';

const base = process.env.PWD,
      client = require(base + '/db.js'),
      assert = require('assert')

let db

const getTodos = async (req, res) => {
  db = await client.connect()
  const collection = await db.collection('documents')
  // Find all todos
  collection.find({}).toArray((err, todos) => {
    assert.equal(err, null)
    res.status(200).json(todos)
  })
  client.disconnect()
}