使用express.js处理猫鼬连接的正确方法是什么?

Rav*_*mer 5 javascript mongoose mongodb node.js express

我有一个非常简单的"server.js"设置,我正在尝试运行:

var express = require('express'),
    wines = require('./routes/testscripts');

var app = express();

app.get('/first_test', wines.popSingleData);

app.listen(3000);
console.log('Listening on port 3000...');
Run Code Online (Sandbox Code Playgroud)

这是为了连接而设置的 localhost:3000

当我导航到localhost:3000/first_test它时,它调用了testscript.js中的"popSingleData"方法:

...
    var mongoose = require('mongoose');

    mongoose.connect('mongodb://localhost/test');

    var db = mongoose.connection;

    console.log('include called');

exports.popSingleData = function(req, res) {

//  var mongoose = require('mongoose');

//  mongoose.connect('mongodb://localhost/test');

//  var db = mongoose.connection;

    console.log('function called');

    db.on('error', console.error.bind(console, 'connection error:'));
    console.log('error handler set');
    db.once('open', function callback () {
        //yay!
        console.log("DB Opened");

        var someSchema = require('../models/someSchema');

        someSchema.find(function (err, found){
            if (err) 
            {
                console.log('err');
            }

            if(found.length != 0) 
            {
                console.log("Found Data:");
                console.log(found);
                for( var i = 0; i < found.length; i++)
                {
                    res.jsonp((found[i]));
                }
            }
        });


    });

};
...
Run Code Online (Sandbox Code Playgroud)

导致问题的行是前3行:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;
Run Code Online (Sandbox Code Playgroud)

在函数内声明它们时,脚本按预期运行,打印出从数据库中找到的JSON对象.当它们在testscript.js中定义时,但在方法范围之外时,程序会挂起db.once('open', function callback () {...}); command.

有人可以了解移动这三行代码所带来的差异吗?每次我想要一个不同的函数来访问数据库时,我真的需要建立一个新的连接吗?

Wir*_*rie 16

如果您已连接到数据库,once则不会再次触发该事件.当数据库全局连接(在函数外部)时,数据库已连接整个NodeJs进程.

调用以mongoose.connect('mongodb://localhost/test');建立连接并打开它.

因此,connect当NodeJs应用程序启动时,不要立即在每个函数调用(这将是一种与MongoDB交互的低效方式)上打开它,并且考虑将存在连接可能不可用的时段(因为它是异步的) ),或者listen在连接完成(或超时)之前不启动app().使用Mongoose,直到建立连接,所有命令都被缓冲(但这可能不是您想要的行为).open如果您想知道连接何时完成,可以使用该事件.

可以在此处找到连接:mongoose.connection如果使用该connect功能来创建连接.

打开连接后,您可以在popSingleData不使用once事件和回调的情况下从函数中使用它.有自动维护的连接池.

有关连接的更多信息,请阅读此处.