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

2024-03-28

我有一个非常简单的“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.

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


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

致电给mongoose.connect('mongodb://localhost/test');建立连接并打开它。

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

连接可以在这里找到:mongoose.connection如果你使用connect函数来创建连接。

连接打开后,您可以从您的设备中使用它popSingleData功能而不使用once事件和回调。有一个自动维护的连接池。

有关连接的更多信息,请阅读here http://mongoosejs.com/docs/connections.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • IE toDataUrl() 安全错误

    我需要从画布上获取图片 因此我从 Amazon S3 获取图像 我在那里启用了跨源资源共享 CORS 并将 croseOrigin 属性 匿名 设置为 img 它适用于 Chrome 和FireFox 但在 IE 上 我通过调用 toDat
  • Protractor 中 element(...) 和 element(...).getWebElement() 之间的区别

    为什么我们需要element getWebElement over element 当两者的工作原理完全相同时 为什么两个 API 具有相同的功能 Protractor是一个方便的包装WebDriverJS javascript 硒绑定 e
  • RXJS while 循环进行分页

    我尝试查询所有人员的数据swap api http swapi co URL swapi co api people 返回一个带有 people 数组的对象 以及我从中获取下一个数据的 URL swapi co api people pag
  • 如何使用 Javascript 更改具有相同类名的多个元素?

    跟进至我之前的问题 https stackoverflow com q 42389937 2803565 我想使用 JS 使用按钮来显示 隐藏具有相同类名的多个元素 但似乎我只能更改具有特定类名的第一个元素 并且页面上具有相同类名的所有其他
  • 如何在cordova中动态加载CSS

    我正在尝试通过 xhr 请求在 cordova 中动态加载 CSS CSS 的加载不是问题 我可以通过 xhr 加载它并通过 HTML5 文件 API 将其存储到文件系统 然后我就可以得到一个完美的 URL 但是如果我通过 javascri
  • 让 `npm install --save` 添加严格版本到 package.json

    当你跑步时npm install save somepackage 它通常会在 package json 中添加这样的内容 dependencies somepackage 2 1 0 因为版本前面带有插入符号 这意味着如果您稍后运行npm
  • 如何在输入Bootstrap Datepicker中仅显示年份?

    我使用以下代码仅显示年份 datepicker datepicker viewMode years minViewMode years 但输入以格式显示 dd mm yyyy 由于我没有格式 我该如何解决这个问题 yyyy 尝试这个 dat
  • 未捕获的类型错误:$(...).lightGallery 不是函数

    当我尝试单击该链接时 它会在浏览器控制台中显示 Uncaught TypeError lightGallery is not a function anonymous function index html 250dispatch jque
  • 对包含数字和字符串的数组进行排序

    我正在尝试对包含字符串 数字和数字作为字符串 例如 1 2 的数组进行排序 我想对这个数组进行排序 以便排序后的数组首先包含数字 然后包含包含数字的字符串 最后包含字符串 var arr 9 5 2 ab 3 1 to be sorted
  • Indexeddb 添加新值而不是更新现有值

    当尝试更新其中的记录时索引数据库使用put方法 看起来是创造了新的价值而不是改变 根据MDN https developer mozilla org en US docs Web API IDBObjectStore put这是更新记录的方
  • 使用 Node.js 从 URL 读取内容

    我正在尝试使用 Node js 从 URL 读取内容 但我似乎得到的只是一堆字节 我显然做错了什么 但我不确定是什么 这是我目前拥有的代码 var http require http var client http createClient
  • 如何在 Chart.js 中将 Y 轴值从数字更改为字符串?

    我在用Chart js http www chartjs org 我正在尝试更改 y 轴 请参见下面的屏幕截图 我尝试填写yLabels具有字符串数组的属性 但这没有用 任何帮助 将不胜感激 jQuery document ready fu
  • 如何在 PhantomJS 中使用 JavaScript 检测网页上的声音?

    我需要检测带有横幅的网页中的所有声音 我怎样才能做到这一点 我查看 PhantomJS 但找不到浏览器声音的 API PhantomJS 1 x 和 2 不支持 Flash
  • Twitter Bootstrap 2 模式表单对话框

    我有以下对话框 div class modal div class modal header a class close a h3 Add Tags h3 div div class modal body div div
  • Parse JS SDK:无法使用主密钥,尚未提供

    我需要在我的 angular2 应用程序中使用 masterKey 但我无法将其传递给initialize功能 我无法用谷歌搜索出原因 从package json parse 1 9 2 初始化 import Parse from node
  • jquery 是否有 .toggle() 的替代方案[重复]

    这个问题在这里已经有答案了 目前根据 Jquerysite http api jquery com category deprecated deprecated 1 8 toggle 在 1 8 版本后已被弃用 那么有没有 toggle 的
  • 如何包含和使用 math.js

    我正在尝试使用 math js http mathjs org docs reference functions inv html http mathjs org docs reference functions inv html 但我不知
  • Node.js 管道化 HTTP 客户端代理?

    Node js 中内置的 HTTP 客户端似乎不支持管道请求 https stackoverflow com a 5776649 362536 然而 我突然想到 也许可以创建一个Agent https nodejs org api http
  • 使用默认参数解构 falsy 和 null

    我试图了解如何使用默认参数来解构虚假值和空值 以下是我运行过的一些示例 1 const person email email protected cdn cgi l email protection const email person e
  • Phonegap - 自动包含正确的科尔多瓦

    我正在 iOS 和 Android 上开发一个 PhoneGap 应用程序 并使用 git 控制我的 www 目录版本 我知道我的 HTML 文件需要包含正确的 Cordova js 文件 取决于我当前正在开发的平台 当有人在 Androi

随机推荐