Express js,mongodb:当在post函数之外提到db时,“ReferenceError:db未定义”

2023-12-15

index.js 文件:

var express = require('express');
var router = express.Router();

function validCheck (exp,name) {
    return exp.test(name);
}
/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index');
});

var user=db.collection('user'); //gives reference error,db is not defined

router.post('/',function(req,res,next){
    username=req.body.username;
    password=req.body.password;
    //var user=db.collection('user'); //works fine
    user.findOne({'username':username,'password':password},function(err,docs){
        //do something
    });
});

module.exports = router;

使用时var user=db.collection('user')外部router.post,它给出了错误,但是当在内部使用相同的内容时router.post,效果很好。

我在这里缺少的概念可能是什么?

编辑:涉及 mongodb 的 App.js 文件的一部分

var mongodb= require('mongodb');
var MongoClient= mongodb.MongoClient;
var URL = 'mongodb://127.0.0.1:27017/mainDB';

MongoClient.connect(URL,function(err,database){
  if(!err){
    db=database;
  }
  else{
    //do something
  }
});

记住MongoClient.connect()是异步的。您此时数据库连接可能尚未准备好var user=db.collection('user');。数据库连接已在回调完成时建立,不早于此。

当第一个请求完成时,数据库连接恰好建立。等待的时间越长,这种方法就越有可能有效,但这仍然是错误的方法。

使用全局变量也是不好的做法,会导致混乱和其他问题.

简而言之,代码应该如下所示

// module database.js
var mongodb= require('mongodb');
var MongoClient= mongodb.MongoClient;
var URL = 'mongodb://127.0.0.1:27017/mainDB';

var db;
var error;
var waiting = []; // Callbacks waiting for the connection to be made

MongoClient.connect(URL,function(err,database){
  error = err;
  db = database;

  waiting.forEach(function(callback) {
    callback(err, database);
  });
});

module.exports = function(callback) {
  if (db || error) {
    callback(error, db);
  } else {
    waiting.push(callback);
  }
}
}

比使用它像

var db = require('database.js');

router.post('/',function(req,res,next){
  username=req.body.username;
  password=req.body.password;

  db.conn(function(err, database) {
    if (err) {
      res.sendStatus(500);
      console.log(err);
      return;
    }

    database.collection('users').findOne({'username':username, 'password':password}, function(err, docs){
      //do something
    });
  });
});

请注意,连接是在第一个 require 时建立的,因此如果您添加require('database.js');在 App.js 中。您不会在第一个请求时丢失。

或者你可以使用promises,它会为您处理等待逻辑。

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

Express js,mongodb:当在post函数之外提到db时,“ReferenceError:db未定义” 的相关文章

随机推荐

  • 数组的累积和

    所以我正在解决一个问题 重点是获取数组的累积和 例如 如果我有一个 0 2 3 1 1 数组 它将返回 0 2 5 4 3 或者如果你有一个 1 2 3 4 5 6 7 8 9 10 数组 它应该返回 1 3 6 10 15 21 28 3
  • Ctrl-Shift-键发出蜂鸣声但不发送到终端

    My OS X terminal does not seem to recognise Ctrl Shift Instead it beeps when I hit Ctrl Shift and any other key on the k
  • 将 cURL 响应流式传输到发布结果的另一个 cURL 命令

    有一个公共流式 Meetup API 可传输 JSON 事件 http stream meetup com 2 rsvps 在命令行的一行中 我希望能够重定向该流 以便将每个 JSON 对象发布到另一个 API 我已经尝试了很多 cURL
  • 在 Python 中生成唯一哈希的最安全方法

    我需要生成可在文件名中使用的唯一标识符 并且可以在给定相同输入值的情况下重现 我需要生成数百万个这样的标识符 因为源输入有数百万种组合 为了简单起见 我将在示例中使用一个小集合 但实际的集合可能相当大 数百个 也许数千个项目 大于可以手动编
  • 因诺数据库;多个数据目录

    我需要将两个 Innodb 数据库文件存储在不同的分区上 一个数据库位于 raid0 上以提高速度 另一个数据库位于 raid1 上以提高稳定性 根据我的阅读 实现这一目标的唯一方法是使用innodb file per table并将 ib
  • ASP.NET Core 中的属性注入

    我正在尝试将 ASP NET 应用程序移植到 ASP NET Core 我在 UnitOfWork 实现上进行了属性注入 使用 Ninject 如下所示 Inject public IOrderRepository OrderReposit
  • 导入错误:无法导入名称 ExponentialSmoothing

    我尝试在 python 中安装 statsmodels 安装后 我用 pip freeze 检查了 该包可以在列表中看到 当我尝试时 from statsmodels tsa api import ExponentialSmoothing
  • R read.table 将行列条目循环到下一行

    这是我第一次使用 read table 遇到此问题 对于具有大量列的行条目 read table 会将列条目循环到下一行 我有一个 txt 文件 其中的行长度可变且不等 作为参考 这是我正在阅读的 txt 文件 http www broad
  • oauth2 openid 连接 javascript (电子) 桌面应用程序

    桌面应用程序的正确 oauth2 流程是什么 除了桌面应用程序之外 我还有一个使用隐式流程的 SPA Web GUI 在那里 客户端是否在 3600 秒后重定向到 IdP 以颁发新的访问令牌并不重要 但桌面应用程序需要 24 7 运行 或者
  • 根据 URL 前缀执行不同的操作

    这是我的情况 我正在我的 ios 应用程序上本地调用文件 在 Swift 中运行 如果文件是 jpg 则发生一个操作 如果文件是 mp4 则发生另一个操作 为此 我使用这段代码 let urlString posts selectedInd
  • 延迟的作业和操作邮件程序

    我在使用 ActionMailer 实施延迟作业时遇到问题 延迟实施工作之前 class NotificationsMailer lt ActionMailer Base default from gt email protected de
  • Ionic - 没有互联网连接

    我们正在使用 Ionic Cordova 构建 Android 应用程序 这一切都在我的浏览器中运行 但是当我构建它并运行 apk 时 会发生这种情况 外部图像不会出现 嵌入的谷歌地图仍为空 我们的index html中有以下代码
  • 如何因 Django 中的不活动而使会话过期?

    我们的 Django 应用程序具有以下会话管理要求 当用户关闭浏览器时 会话就会过期 会话在一段时间不活动后就会过期 检测会话何时因不活动而过期并向用户显示适当的消息 在不活动期结束前几分钟警告用户会话即将到期 除了警告之外 还为用户提供延
  • CoreData 唯一约束在 Xcode 中消失

    我想做的事 为属性添加唯一约束photoID在实体中PhotoUpload Problem 我点击约束并添加photoID 当我导航到另一个文件并返回到xcdatamodeld文件中 约束不存在 它会自动删除 所以唯一约束不起作用 到目前为
  • java 8 中的函数式接口如何工作

    这是我在研究函数式接口概念时遇到的一个例子 interface Sayable void say public class MethodReference public static void saySomething System out
  • onActivityResult 返回 Intent data.getData();始终为 Null 仅在 Marshmallow 和 Lollipop 中

    阅读我的整个代码 它在所有手机上都能完美运行 除了Marshmallow and Lollipop In Marshmallow and Lollipop电话 唯一的问题是进来data getData 返回null仅在以下情况下拍摄的照片
  • 如何让弹性项目具有相同的宽度?

    我希望第一个和最后一个元素具有相同的宽度 怎么做 main display flex justify content space between width 100 input width 200px
  • 人工智能如何为战舰进行基因编程建模

    我有一个关于基因编程的问题 我将研究遗传算法游戏名为战舰 我的问题是 我如何决定人工智能进化的 决策 模型 这是如何运作的 我已经阅读了多篇论文和多个答案 这些论文和答案只是谈到使用不同的模型 但找不到具体的内容 不幸的是 我显然需要集中精
  • 如何在Python中获取当前时间并将其分解为年,月,日,小时,分钟?

    我想获取Python中的当前时间并将它们分配给变量 例如year month day hour minute 在 Python 2 7 中如何做到这一点 The datetime模块是你的朋友 import datetime now dat
  • Express js,mongodb:当在post函数之外提到db时,“ReferenceError:db未定义”

    index js 文件 var express require express var router express Router function validCheck exp name return exp test name GET