如何纠正摩卡中mongoose的"connection.readyState"从"连接"到"连接?

Man*_*anu 0 mongoose node.js

当我试图运行mocha测试时, 由于猫鼬连接处于连接状态,我得到"无法确定服务器状态".

请建议如何处理这种情况.

var mongoose = require('mongoose');

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

console.log('conn ready:  '+mongoose.connection.readyState);

// "conn ready: 2"  i.e connecting for test case as well as from user register form 


var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId,

    UserSchema = new Schema({

       // schemas

    });


UserSchema.statics.newUser = function (uname, email, pass) {

    var instance = new User();

    instance.uname  = uname;

    instance.email  = email;

    instance.pass   = pass;

    console.log("conn state: "+mongoose.connection.readyState); 

    // "conn state: 2"  i.e connecting for test case. But  1  i.e connected for  user register form 

    instance.save(function (err) {
      // Do rest
    });

};

var User = mongoose.model('User', UserSchema);
exports.User = User;
Run Code Online (Sandbox Code Playgroud)

C B*_*ard 5

数据库连接是异步发生的,所以当你在调用之后直接检查它时,connect它可能会报告它仍在连接.如果要在连接后执行某些操作,则需要传入回调

mongoose.connect('mongodb://localhost/test', function (error) {
  // Do things once connected
});
Run Code Online (Sandbox Code Playgroud)

至于如何在您的场景中处理它,我的建议是将连接与模型分开,并在需要时连接到MongoDB

因此,如果您在mocha中测试用户模型,可以在Before钩子中完成

var mongoose = require("mongoose");

// Load in your user model wherever that is
var User = require("../models/user");

describe("My user model tests", function () {
  // Connect to mongodb here before you start testing
  before(function (done) {
    mongoose.connect('mongodb://localhost/test', function (error) {
      if (error) throw error; // Handle failed connection
      console.log('conn ready:  '+mongoose.connection.readyState);
      done();
    });
  });

  // And include disconnect afterwards
  after(function (done) {
    mongoose.disconnect(done);
  });

  // Test your user model down here
  it("passes some tests");
});
Run Code Online (Sandbox Code Playgroud)

根据您的应用程序结构,我建议您将数据库连接移动到合理的位置(例如服务器配置).当你测试你的整个应用程序(如集成测试),您将开始您的服务器在Before