如何在不使用mongoose的情况下,使用express连接到mongodb?

12

我正在使用express框架,希望能够连接到mongodb,但不使用mongoose,而是使用原生的nodejs Mongodb驱动程序。如何在不每次创建新连接的情况下实现这一点?

目前,为了处理get或post请求,我每次都会打开一个新的数据库连接,并在请求完成后关闭它。是否有更好的方法?先谢谢了。


2
我不确定每次都需要打开一个新的连接。请查看https://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html#mongoclient-connection-pooling。 - Paul
但是如果无法建立到数据库的连接,则服务器本身将无法启动。 - Saurabh Verma
基本模式仍然有效。我会跟进一个相应的答案。 - Paul
2个回答

14

根据我的评论示例,对其进行修改以便应用程序处理错误而不是无法启动服务器。

var express = require('express');
var mongodb = require('mongodb');
var app = express();

var MongoClient = require('mongodb').MongoClient;
var dbURL = "mongodb://localhost:27017/integration_test";
var db;

// Initialize connection once
MongoClient.connect(dbURL, function(err, database) {
  if(err) return console.error(err);

  db = database;

  // the Mongo driver recommends starting the server here 
  // because most apps *should* fail to start if they have no DB.
  // If yours is the exception, move the server startup elsewhere. 
});

// Reuse database object in request handlers
app.get("/", function(req, res, next) {
  var collection = "replicaset_mongo_client_collection";
  db.collection(collection).find({}, function(err, docs) {
    if(err) return next(err);
    docs.each(function(err, doc) {
      if(doc) {
        console.log(doc);
      }
      else {
        res.end();
      }
    });
  });
});

app.use(function(err, req, res){
  // handle error here.  For example, logging and 
  // returning a friendly error page
});

// Starting the app here will work, but some users 
// will get errors if the db connection process is slow.  
app.listen(3000);
console.log("Listening on port 3000");

如果我正在使用mongoose呢? - Sudhir Kaushik
9
如果你真的是那样,该怎么办?这个回答是针对“如何在没有mongoose的情况下完成它”的问题。 - Paul
2
当你回顾自己的答案并感觉“我本可以用更好的方式表达”的时候,这种感觉真是尴尬。无论如何,我的上面的问题有点自私,因为我试图使用mongoose进行设置。应该用不同的问题来问。没关系。 - Sudhir Kaushik
2
@SudhirKaushik 看看这个。有很多使用mongoose的教程。感谢Paul分享这个片段。 - Verma Aman

3
var mongodb = require('mongodb');
var uri = 'mongodb://localhost:27017/dbname';

module.exports = function(callback) {
  mongodb.MongoClient.connect(uri, callback);
};

将此片段添加到一个名为connect.js的文件中,然后在声明HTTP请求函数的文件中引用此文件(connect.js)。


2
但是这段代码片段每次都会创建一个新的连接请求,这不是我们想要的。 - Saurabh Verma
在我看来,正确的方式是在发出 HTTP 请求之前检查连接是否已建立。 - amanpurohit
1
我相信要求这个片段将会被缓存到应用程序中,它不会每次都发起新的请求。 - Daniele Graziani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接