【问题标题】:What's the proper way to handle mongoose connections with express.js?用 express.js 处理猫鼬连接的正确方法是什么?
【发布时间】:2013-08-18 01:23:25
【问题描述】:

我尝试运行一个非常简单的“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...');

这是设置为连接到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]));
                }
            }
        });


    });

};
...

导致问题的行是前 3 行:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;

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

有人能解释一下移动这 3 行代码所产生的区别吗?每次我想要一个不同的函数来访问数据库时,我真的需要建立一个新的连接吗?

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    如果您已经连接到数据库,once 事件将不会再次触发。全局连接时(函数外部),整个 NodeJs 进程的数据库已经连接。

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

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

    在此处找到连接:mongoose.connection,如果您使用 connect 函数创建连接。

    连接打开后,您可以通过 popSingleData 函数使用它,而无需使用 once 事件和回调。有一个自动维护的连接池。

    有关连接的更多信息,请阅读here。

    【讨论】:

    • 那么mongoose.connect 是什么创建了连接?所以它在方法之外不起作用的原因是该方法发现它已经打开,所以 db.once("open") 永远不会发生?
    • 太棒了。将代码移出回调,它似乎工作得很好。非常感谢!
    • 如何将连接传递到 Expressjs 应用程序中的路由?路由位于单独的模块、文件夹中。
    • @Green - 只需集中连接并在路由中获取它。或使用连接预初始化路由。我都做了。
    • mongoose真正连接数据库时的回调示例?
    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2011-04-01
    • 2018-04-15
    • 2017-10-18
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多