Express js,mongodb:当在 post 函数之外提到 db 时,“ReferenceError: db is not defined”

新手上路,请多包涵

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
  }
});

原文由 R-R 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 551
1 个回答

请记住 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
    });
  });
});

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

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

原文由 Arnold Daniels 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题