Mongoose: рдореЛрдЪрд╛ 'рдШрдбрд╝реА' рдХреЗ рд╕рд╛рде рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдореЙрдбрд▓ рддреНрд░реБрдЯрд┐

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рджрд┐рд╕ре░ 2012  ┬╖  61рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Automattic/mongoose

рдореИрдВрдиреЗ рдЕрднреА 3.4.0 рд╕реЗ 3.5.1 рддрдХ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЬрдм рдореЙрдбрд▓ рдкрд░ рдореЛрдЪрд╛ рдкрд░реАрдХреНрд╖рдг 'рджреЗрдЦ' рд░рд╣рд╛ рд╣реИ, рд╣рд░ рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдкреБрдирдГ рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░, рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ 'рдЖрд╡рд╢реНрдпрдХрддрд╛' рд╕реЗ рдПрдХ рдУрд╡рд░рд░рд╛рдЗрдЯ рдореЙрдбреЗрд▓ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ - рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдореЙрдбрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ред

рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ 'рдУрд╡рд░рд░рд╛рдЗрдЯ' рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдореВрд▓реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП 3.4.0 рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд░реНрдж рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ: рд╕рднреА рдореЙрдбрд▓реЛрдВ рдФрд░ рдпреЛрдЬрдирд╛рдУрдВ рд╕реЗ рдиреЗрд╡рд▓реЗ рдХреА рд╕рдлрд╛рдИред
рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ, рдореИрдВрдиреЗ рдЬреЛрдбрд╝рд╛:

 mongoose.models = {};
 mongoose.modelSchemas = {};

рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдПред

рд╕рднреА 61 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рдПрдХ рд╣реА рдирд╛рдо рдФрд░ рд╕реНрдХреАрдорд╛ рдХреЗ рд╕рд╛рде mongoose.model() рдпрд╛ connection.model() рдХреЛ рдХрдИ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдХрд┐рд╕реА рднрд┐рдиреНрди рд╕реНрдХреАрдорд╛ рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рдореЙрдбрд▓ рдХрд╛ рдирд╛рдо рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдУрд╡рд░рд░рд╛рдЗрдЯрд┐рдВрдЧ рдореЙрдбрд▓ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рднреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЧрдИ рдереАред

рдЕрдЧрд░ рдореЛрдЪрд╛ рдШрдбрд╝реА рдХреЛ рдЖрдкрдХреА рд╕реНрдХреАрдорд╛ рдХреА рдлрд┐рд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ mongoose.model(preExistingName, newSchema) рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рддреЛ рд╣рд╛рдБ рдЕрдм рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдиреЗрд╡рд▓рд╛ рдПрдХ рдирдпрд╛ рдореЙрдбрд▓ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛, рдпрд╣ рд╕рд┐рд░реНрдл рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдХреЛ рдирд┐рдЧрд▓ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреБрд░рд╛рдиреЗ рдореЙрдбрд▓ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛, рдЬреЛ рдХрд┐ рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред

var schema = new Schema;
var A = mongoose.model('A', schema);
var B = mongoose.model('A', schema); // no error
var C = mongoose.model('A', new Schema); // previously unreported error

рдареАрдХ рд╣реИ, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

@aheckmann - рдореИрдВ рднреА рдЗрд╕реЗ рдорд╛рд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдиреАрдЪреЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдХреНрд▓реАрди рдЯреЗрд╕реНрдЯ рд░рди рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдПрдХ рдлрд╛рдЗрд▓ рдХреЛ рдПрдбрд┐рдЯ + рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореЛрдЪрд╛ --watch рд╕рд╛рде рд░реА-рд░рди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ

OverwriteModelError: Cannot overwrite "User" model once compiled.

user.js

var mongoose = require('mongoose'),
  Schema = mongoose.Schema,
  ObjectId = mongoose.SchemaTypes.ObjectId;

var userSchema = new Schema({
  name: { type: String }
}), 
  User;

// other virtual / static methods added to schema

User = mongoose.model('User', userSchema);
module.exports = User;

userSpec.js

var User = require('../models/user'),
  mongoose = require('mongoose');

mongoose.connection.on('error', function (err) {
  console.log(err);
}

mongoose.connection.on('open', function () {
  console.log('connected');
}

describe('User', function () {

  before(function (done) {
    mongoose.connect('mongodb://localhost/test');
    done();
  }

  after(function (done) {
    mongoose.disconnect(function () {
      console.log('disconnected');
      done();
    });
  });

  it('should test something', function (done) {
     // tests
     done();
  });
});

рдиреЗрд╡рд▓рд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рд╣рд░ рдмрд╛рд░ рдмрд╕ рдирдП рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

var db = mongoose.createConnection()

https://github.com/LearnBoost/mongoose/blob/master/test/common.js#L74 -L98

Google рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд░реНрддреА рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ https://groups.google.com/d/topic/mongoose-orm/PXTjqqpaDFk/discussion

рдореИрдВ рдпрд╣ рднреА рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣рд╛рдБ рдПрдХ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рд╣реИ:

https://github.com/j0ni/mongoose-strangeness

рд╢рд╛рдпрдж рдореБрдЭреЗ рдореЙрдбрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ ...?

https://github.com/j0ni/mongoose-strangeness/blob/master/test.spec.js#L21

var Example = connection.model('Example', ExampleSchema) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдзрдиреНрдпрд╡рд╛рдж @aheckmann рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ b/ca рдЖрдкрдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдмреА/рд╕реА рдореЙрдбрд▓ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдиреЗрд╡рд▓рд╛ рдореЙрдбреНрдпреВрд▓ рд╕реНрддрд░ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рд╣реЛ рд░рд╣реЗ рдереЗ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ред

@aheckmann - рд▓реЛрдХреЛрдореЛрдЯрд┐рд╡ рдРрдк рдореЗрдВ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИред

рдореВрд▓ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд▓реЛрдХреЛрдореЛрдЯрд┐рд╡ рдРрдк рдХреЛ before() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмреВрдЯ рдХрд░рддреА рд╣реИред рдРрдк рдХреЛ рдмреВрдЯ рдХрд░рдирд╛ рдПрдХ рдореЛрдВрдЧреЛ рдбреАрдмреА рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рд╕рднреА рдореЙрдбрд▓реЛрдВ рдореЗрдВ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ - рдпрд╣ рдореЗрд░реА рдиреЗрд╡рд▓рд╛ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ (рдРрдк рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдПрдХ рдмрд╛рд░ рдЪрд▓рддрд╛ рд╣реИ):

var mongoose = require("mongoose"),
    fs = require("fs");

module.exports = function() {

  // Connect to DB
  switch (this.env) {
    case 'development':
      mongoose.connect('mongodb://localhost/slipfeed');
      break;
    case 'test':
      mongoose.connect('mongodb://localhost/slipfeed');
      break;
    case 'production':
      mongoose.connect('mongodb://mongodb.example.com/prod');
      break;
  }

  // Load models  
  var app = this,
      modelPath = app.get('models');
  fs.readdirSync(modelPath).forEach(function(file) {
    var name = file.substr(0, file.lastIndexOf('.'));
    require(modelPath + '/' + name)(mongoose, app);
  });

}

рдореЗрд░реА рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдлрд╛рдЗрд▓ рдореЗрдВ, рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдпрд╣ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

module.exports = function(mongoose, app) {
  var Schema = mongoose.Schema;
  var User = new Schema(...);
  app.User = mongoose.model('User', User);
});

рдФрд░ рдореЗрд░реА рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдкрд░реАрдХреНрд╖рдг рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдореИрдВ рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

var locomotive = require("locomotive"),
    app = new locomotive.Locomotive(),
    should = require("should");

describe( "User", function() {

  before( function (done) {
    app.boot( process.cwd(), 'test', function () {
      done();
    });
  });

  after( function (done) {
    mongoose.disconnect( function (err) {
      if (err) throw err;
      console.log('DISCONNECT')
      done();
    })
  });      

  ...tests go here

});

app.boot() рднрд╛рдЧ рдмрд╕ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯрд┐рд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ (рдЬреЛ рдХреЗрд╡рд▓ рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдХреЛрдб рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЯреБрдХрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбреАрдмреА рдХрдиреЗрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛)ред

рд▓реЗрдХрд┐рди рдореЗрд░реА рдкрд╣рд▓реА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдФрд░ рдореЛрдЪрд╛ рдЕрдЧрд▓реА рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ OverwriteModelError ред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдЧрд▓реА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдХреБрдЫ рд╕рдВрдмрдВрдз рд╣реИ, рдпрд╛ рд╢рд╛рдпрдж рдореИрдВ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЛ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╡реИрд╕реЗ рднреА, рдореИрдВрдиреЗ рдЕрдкрдиреЗ after() рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ mongoose.disconnect рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реАред

рдЗрд╕рдХрд╛ рдЦреБрд▓реЗ рдпрд╛ рдмрдВрдж рдХрдиреЗрдХреНрд╢рди рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЖрдк рдПрдХ рдРрд╕реЗ рдореЙрдбрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рднрд┐рдиреНрди рд╕реНрдХреАрдорд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред

var a = new Schema({ x: 'string' });
var b = new Schema({ x: 'string' });
mongoose.model('Thingy', a);
mongoose.model('Thingy', a); // ok, a === the registered schema instance
mongoose.model('Thingy', b); // error a !== the registered schema

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдХрдо рдорд╛рдореВрд▓реА рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдЗрд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рдЖрдиреЗ рд╕реЗ рд░реЛрдХ рджреЗрдЧрд╛ред рд╢рд╛рдпрдж рдПрдХ рдЫреЛрдЯрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдРрдк, рдЬреЛ рдПрдХ рдореЙрдбрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЗрдВрдЬреЗрдХреНрд╢рди рдпреЛрдЧреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдореЛрдЪрд╛ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рд╕реБрдкрд░рдЯреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА) рдЬреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдП рдмрд┐рдирд╛ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред

рдЕрдЧрд░ рд╡рд╣рд╛рдБ рдХреБрдЫ рдРрдк рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк @aheckmann рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдПрдХ рд╡рд┐рд╣рд┐рдд рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЪрд╛рд▓ рдЪрд▓реЗрдЧрд╛ред

рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдпрд╛ рд╣реИ:

https://github.com/j0ni/beachenergy.ca/blob/master/datamodel/index.js

рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЕрдЧрд░ рдореИрдВ рдПрдХ рдиреЗрд╡рд▓рд╛ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рд╕рдВрднрд╛рд╡рдирд╛ рд▓рдЧрддрд╛ рд╣реИ) рдПрдХ рд╡рд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг рдорджрдж рдХрд░реЗрдЧрд╛ред

рд╣рд╛рдп @aheckmann - рдореБрдЭреЗ 100% рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдЕрд▓рдЧ рд╕реНрдХреАрдорд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдореЙрдбрд▓ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдХрд╛рд▓ / рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛: https://github.com/davisford/mongoose-test

make рд╕рд╛рде рдореЛрдЪрд╛ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдкрд╣рд▓реА рдмрд╛рд░ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛрдВрдЧреЗред рдЕрдм, models/user.js рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕рд╣реЗрдЬреЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП CTRL/CMD + S), рдФрд░ рдореЛрдЪрд╛ --watch рд╕рд╛рде рдкрд░рд┐рд╡рд░реНрддрди рдЙрдард╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдордиреЗ OverwriteModelError рдорд╛рд░рд╛ред

рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ... рдореИрдВ nodemon рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рдиреЗ рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛ:
$ рдиреЛрдбрдореЙрди --exec "рдореЛрдЪрд╛-рдЖрд░ рдорд┐рди" рдкрд░реАрдХреНрд╖рдг

рддреЛ рдЗрд╕рдХрд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреНрдпрд╛ рд╣реИ? рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдПрдВ? рд╣рдо рдЕрдкрдиреЗ рдЪрд╢реНрдореЗ рдореЗрдВ рдПрдХ рдиреЗрд╡рд▓рд╛ рдореЙрдбрд▓ рдХреЛ рдФрд░ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ?

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдХреЗрд▓реЗ рдореЛрдЪрд╛ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореИрдВ рдЬреЛ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдореЛрдЪрд╛ рдХреЛ рдиреЛрдбрдореЙрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВред рдЗрд╕ рддрд░рд╣, рдиреЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдкреЗрдЯреНрдЯрд░ рдЧреНрд░реИрдлрд╝
(рдореЗрд░реЗ iPad рд╕реЗ рднреЗрдЬрд╛ рдЧрдпрд╛, рд╡рд░реНрддрдиреА рдХреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ :)
+1.512.784.3232
рдЫреЛрдЯрд╛ [email protected]

2 рдлрд░рд╡рд░реА 2013 рдХреЛ рд╕реБрдмрд╣ 5:41 рдмрдЬреЗ, рдУрд▓рд┐рд╡рд░ рдЬреЛрд╕реЗрдл рдРрд╢ рдиреЗ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рд▓рд┐рдЦрд╛:

рддреЛ рдЗрд╕рдХрд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреНрдпрд╛ рд╣реИ? рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдПрдВ? рд╣рдо рдЕрдкрдиреЗ рдЪрд╢реНрдореЗ рдореЗрдВ рдПрдХ рдиреЗрд╡рд▓рд╛ рдореЙрдбрд▓ рдХреЛ рдФрд░ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ?

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреЛрдбрдореЙрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЛрдЪрд╛ рдХреИрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ? рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореИрдВ рд╢рд╛рдпрдж рдмрд╣реБрдд рджреВрд░ рд╣реВрдБ:

nodemon /usr/local/share/npm/bin/mocha --reporter spec --ui bdd --watch ./server/test/*.js

рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
рдиреЛрдбрдореЙрди --exec "рдореЛрдЪрд╛-рдЖрд░ рдорд┐рди" рдкрд░реАрдХреНрд╖рдг

рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк min рдХреЗ рдмрдЬрд╛рдп spec рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд░реНрд╡рд░/рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ ... рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓реЗрдВ ...

2 рдлрд░рд╡рд░реА 2013 рдХреЛ рд╕реБрдмрд╣ 7:00 рдмрдЬреЗ, рдУрд▓рд┐рд╡рд░ рдЬреЛрд╕реЗрдл рдРрд╢ рдиреЗ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рд▓рд┐рдЦрд╛:

рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреЛрдбрдореЙрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЛрдЪрд╛ рдХреИрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ? рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореИрдВ рд╢рд╛рдпрдж рдмрд╣реБрдд рджреВрд░ рд╣реВрдБ:

nodemon /usr/local/share/npm/bin/mocha --reporter spec --ui bdd --watch ./server/test/*.js
-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

рдЕрдЪреНрдЫрд╛ рд╣реИред --watch рдЬрд┐рддрдирд╛ рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдпрд╣ рднреА рджреЗрдЦрд╛ рдХрд┐ рдЬрдм рдореЛрдЪрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрдХреАрдорд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдореЛрдЪрд╛ рдЙрдиреНрд╣реЗрдВ рдХреИрд╢ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкреБрдирдГ рд▓реЛрдб рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ :(

2 рдлрд░рд╡рд░реА 2013 рдХреЛ 15:23 рдмрдЬреЗ, рдкреЗрдЯреНрдЯрд░ рдЧреНрд░реЗрдл рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
рдиреЛрдбрдореЙрди --exec "рдореЛрдЪрд╛-рдЖрд░ рдорд┐рди" рдкрд░реАрдХреНрд╖рдг

рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк min рдХреЗ рдмрдЬрд╛рдп spec рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд░реНрд╡рд░/рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ ... рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓реЗрдВ ...

2 рдлрд░рд╡рд░реА 2013 рдХреЛ рд╕реБрдмрд╣ 7:00 рдмрдЬреЗ, рдУрд▓рд┐рд╡рд░ рдЬреЛрд╕реЗрдл рдРрд╢ рдиреЗ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рд▓рд┐рдЦрд╛:

рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреЛрдбрдореЙрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЛрдЪрд╛ рдХреИрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ? рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореИрдВ рд╢рд╛рдпрдж рдмрд╣реБрдд рджреВрд░ рд╣реВрдБ:

nodemon /usr/local/share/npm/bin/mocha --reporter spec --ui bdd --watch ./server/test/*.js
-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

@ j0ni рдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рд╕рднреА рдХреЙрд▓реЛрдВ рдХреЛ "mongoose.model" рдХреЗ рд╕рд╛рде рдмрджрд▓рдХрд░ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛:

try {
    // Throws an error if "Name" hasn't been registered
    mongoose.model("Name")
} catch (e) {
    mongoose.model("Name", Schema)
}

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЙрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдХреЗ рдХреЛрдб рдХреЛ рдЦрд░рд╛рдм рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╕рдмрд╕реЗ рдЖрдо рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдХреАрдорд╛ рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдлрд┐рд░ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╢рд╛рдпрдж рдЗрд╕реЗ mongoose.getOrCreate(name, schema) рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд╣реЗрдВред

@yourcelf рдиреЗ рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ рд▓рд┐рдпрд╛ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдзрдиреНрдпрд╡рд╛рджред

module.exports = getOrCreateModel('User', UserSchema);

рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ: рд╕рднреА рдореЙрдбрд▓реЛрдВ рдФрд░ рдпреЛрдЬрдирд╛рдУрдВ рд╕реЗ рдиреЗрд╡рд▓реЗ рдХреА рд╕рдлрд╛рдИред
рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ, рдореИрдВрдиреЗ рдЬреЛрдбрд╝рд╛:

 mongoose.models = {};
 mongoose.modelSchemas = {};

рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдПред

@remicastaing рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА, рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

@remicastaing рдЕрдм рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди!

@remicastaing рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд┐рдпрд╛, рдЕрдм рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ

@remicastaing рд╣рд╛рдБ, рдПрдХ рдХрд╛рдордХрд╛рдЬреА рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИред

@remicastaing рдзрдиреНрдпрд╡рд╛рдж, рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

@remicastaing рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

рдПрдХ рдкреБрд░рд╛рдиреА рдЦреБрдЬрд▓реА рдХреЛ рдЦрд░реЛрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдореЛрдЪрд╛-рдбрдмреНрд▓реНрдпреВ рдХреЛ рдиреЗрд╡рд▓реЗ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реА рд╣реИ, рд╣рд░ рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рджреАрд╡рд╛рд░ рд╕реЗ рдЯрдХрд░рд╛ рд░рд╣рд╛ рд╣реВрдВред

рдореБрдЭреЗ рдХрд╣рд╛рдБ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП

 mongoose.models = {};
 mongoose.modelSchemas = {};

?

рдкреНрд░рддреНрдпреЗрдХ рд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд╛рдж, рдмрд╛рдж рдореЗрдВ, рдкрд╣рд▓реЗ?

рдХреНрдпрд╛ рдореБрдЭреЗ рдкрд╣рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ mongoose.createConnection () рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд╛рдж рдмрдВрдж рдХрд░реЗрдВ?

рдореИрдВрдиреЗ рд░рдЦрд╛

mongoose.models = {};
mongoose.modelSchemas = {};

рдПрдХрджрдо рдмрд╛рдж

var mongoose = require('mongoose');

config.test.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реАрдзреЗ test рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ ( config.test.js рдкрд░реАрдХреНрд╖рдг рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЗрд╡рд▓ *.test.js рдлрд╝рд╛рдЗрд▓, рдЕрдиреНрдп *.test.js рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдВрджрд░ рд╣реИрдВ рдЙрдк рдлрд╝реЛрд▓реНрдбрд░)ред рдЬреИрд╕реЗ рд╣реА рдореЛрдЪрд╛ рдкрд░реАрдХреНрд╖рдг рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ ( --recursive рд╡рд┐рдХрд▓реНрдк mocha.opts ) рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ config.test.js рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

@remicastaing рдзрдиреНрдпрд╡рд╛рдж! рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░реЛ (рдЪрдореЗрд▓реА)

рдмрд╕ рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛:
рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдореБрджреНрджрд╛ рдерд╛, рдЬрдм рдореБрдЭреЗ рдХреЛрдб рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрдирд╛ рдореЗрдВ:
var User = require('./models/user');
рдФрд░ рдХреЛрдб . рдореЗрдВ
var User = require('./models/User');
рдмрд╕ рдзреНрдпрд╛рди рд░рдЦреЗрдВ, рд╡рд┐рднрд┐рдиреНрди рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХреИрд╢реНрдб рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рдерд╛

+1 рдЬреЛ @asci рдиреЗ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд╣реА рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде, рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ рджреВрд╕рд░реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ 'рдУрд╡рд░рд░рд╛рдЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛' рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛

@iandoe рдореИрдВ mongoose.connect рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореЛрдЪрд╛ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ

after(function(done){
  mongoose.models = {};
  mongoose.modelSchemas = {};
  mongoose.connection.close();
  done();
});

:+1: :рдзрдиреБрд╖:

:+1:

рдЖрдк рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ beforeEach , рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ var db = mongoose.createConnection(); рдФрд░ рдлрд┐рд░ db.model(...) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ mongoose.model(...); рдореЗрдВ beforeEach . рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдЧ рдХреЗ рдмрдЬрд╛рдп рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдкреБрдирдГ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореИрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рд╕реНрдХреАрдорд╛ рдпрд╛ рдореЙрдбрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдореМрдЬреВрджрд╛ рдореЙрдбрд▓ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЬрдм рддрдХ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рди рд╣реЛ, рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдореБрдЭреЗ рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрджрд╛рд╣рд░рдг

delete mongoose.models['somemodel'];
var somemodel = db.mongoose.model('somemodel', someschema);

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдореЙрдбрд▓/рд╕реНрдХреАрдорд╛ рдХреЛ рдорд┐рдЯрд╛рдП рдмрд┐рдирд╛ рд╕реНрдХреАрдорд╛ рдФрд░ рдореЙрдбрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛ рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЖрдЧреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рдИред

рдореЗрд░рд╛ рд╣реЛ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

@yourcelf рдХреЗ рдкрд╛рд╕ рдЕрдзрд┐рдХрд╛рд░ рд╣реИред

:+1:

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд░рд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рдкрд░ рдареЛрдХрд░ рдЦрд╛рддрд╛ рд╣реИ рддреЛ рдореИрдВрдиреЗ рдЗрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛:

// DatabaseUtils.js
import mongoose from 'mongoose';
const MONGO_URI = 'mongodb://localhost:27017/collectionname'

export function tearDown(){
  mongoose.models = {};
  mongoose.modelSchemas = {};
  resetDb();
  if(mongoose.connection.readyState) mongoose.disconnect();
}

export function setUp(){
  if(!mongoose.connection.readyState) mongoose.connect(MONGO_URI);
}

export function resetDb(){
  if(mongoose.connection.db) mongoose.connection.db.dropDatabase();
}

рдлрд┐рд░ рдЕрдкрдиреА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

import { setUp, tearDown, resetDb } from './DatabaseUtils'

describe('Testing MongoDB models', function(){
  before(setUp)
  after(tearDown)
  afterEach(resetDb)

  it('Some test of a mongoose model', () =>  {
  // Test code here.
  }
})

рдпрд╣ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдЙрддреНрддрд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:

let users
try { users = mongoose.model('users') }
catch (e) { users = mongoose.model('users', <UsersSchema...>) }

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЬреИрд╕рд╛ рдХрд┐ @DanielRamosAcosta рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, "рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреА рд╕реНрдХреАрдорд╛ рдмрджрд▓рддреА рд╣реИ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред"

рдзрдиреНрдпрд╡рд╛рдж @remicastaing , рдореИрдВ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рддрдХ 5 рдорд┐рдирдЯ рдЦреЛ рдЪреБрдХрд╛ рд╣реВрдВ, рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП :)

рдзрдиреНрдпрд╡рд╛рдж @juanpabloaj , рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛

@gunar рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреА рд╕реНрдХреАрдорд╛ рдмрджрд▓рддреА рд╣реИ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

@juanpabloaj рдзрдиреНрдпрд╡рд╛рдж рднрд╛рдИ!

рдореИрдВ рдмрд╕ рдмрджрд╕реВрд░рдд рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

let users = mongoose.models.users || mongoose.model('users', <UsersSchema...>)

рдпрд╣ рдЪрд░реНрдЪрд╛ рд╡рд╛рдХрдИ рд╢рд░реНрдордирд╛рдХ рд╣реИ
рдиреЗрд╡рд▓реЗ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЗрдЦрдХреЛрдВ рдиреЗ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди ( 1 рдФрд░ 2 ) рджрд┐рдпрд╛, рдлрд┐рд░ рднреА рд╕рднреА рдЕрдВрдЧреВрдареЗ рдЧрд▓рдд рд╣реИрдХреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдкрд░ рдЪрд▓реЗ рдЧрдПред
рд╡рд╛рдХрдИ рд╢рд░реНрдордирд╛рдХ

@ tomyam1 , рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╡реЗ

рдХрднреА-рдХрднреА рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рд╣реА рд╕реЗ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ :)

@tomyam1 рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рднреА рд╢рд░реНрдордирд╛рдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рдЙрди рд╕рднреА рдХрд╛ рдЖрднрд╛рд░реА рд╣реВрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдпрд╣рд╛рдВ рд╕рдорд╛рдзрд╛рди рдкрд░ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ - рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 'рдЧрд▓рдд рд╣реИрдХреА' рд╕реБрдЭрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕реЗ рдЖрдк 'рд╕рд╣реА' рд╕рдорд╛рдзрд╛рди рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рдиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдПрдХ рджреВрд╕рд░реЗ рдХреА рдорджрдж рдХрд░рдирд╛ рд╢рд░реНрдордирд╛рдХ рдирд╣реАрдВ рд╣реИред рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдПрдХ рд░рдЪрдирд╛рддреНрдордХ рдкреЛрд╕реНрдЯ рдХреА рд╣реИред

рдЦреИрд░ рдорд╣реЛрджрдп (рдЧреИрд░реЗрдердбрд╛рдЙрди 44, рдлреЗрдЧрд╛), рддреЛ рд╣рдо рдЕрд╕рд╣рдордд рд╣реИрдВред
рдЕрдзрд┐рдХ рд╕реНрдкреИрдо рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдЗрдореЛрдЬреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рд╕рдореЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП:

рдЗрд╕ рдкреГрд╖реНрда рдореЗрдВ рдХреЗрд╡рд▓ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:

  1. рдХреИрд╢реНрдб рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ:
mongoose.models.users || mongoose.model('users', <UsersSchema...>)

рдпрд╛

try {
    // Throws an error if "Name" hasn't been registered
    mongoose.model("Name")
} catch (e) {
    mongoose.model("Name", Schema)
}

рдпрд╣ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЙрдбрд▓реЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдЙрдард╛рдПрдЧрд╛ред

  1. рдореЙрдбрд▓ рдХреИрд╢ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ
 mongoose.models = {};
 mongoose.modelSchemas = {};

рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ рдХреНрдпреЛрдВ?
рдпрд╣ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
2013 рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╢рд╛рдпрдж рдЗрд╕рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ 4 рд╕рд╛рд▓ рдмрд╛рдж рд╣реИред

  1. рдХрдиреЗрдХреНрд╢рди рдкрд░ рдореЙрдбрд▓ рд╕рд╣реЗрдЬреЗрдВред
    рдпрд╣ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдореЛрдЧреЛрдЬрд╝ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
    рдФрд░ рдлрд┐рд░ рднреА рдЗрд╕реЗ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╢рд░реНрдордирд╛рдХ рд╣реИред
const Mongoose = require('mongoose');
const DB = Mongoose.createConnection(...);
const Model = DB.model("Name", schema);

@ tomyam1 - рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рд╖реНрдкрдХреНрд╖ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рджреВрд╕рд░реЗ (рд╣реИрдХреА) рд╕рдорд╛рдзрд╛рди рдХреЗ рджреЛ рд╕рд╛рд▓ рдмрд╛рдж рдЖрдпрд╛ !!

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВрдиреЗ рдиреЛрдбрдореЛрди рд╕рдорд╛рдзрд╛рди рдЪреБрдирд╛ред рдЬрдм рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЯреЗрд╕реНрдЯ рдХреЛрдб рдХреЛ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реЗ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдордп рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдиреЛрдбрдореЙрди рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕реЗ +1 рдХрд┐рдпрд╛ред рдореИрдВ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд╣ рд░рд╣рд╛ рд╣реВрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, Nodemon рдкреВрд░реЗ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред mocha --watch рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдкреБрдирдГ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ

рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ, Nodemon рдкреВрд░реЗ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП mocha --watch рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рдкреБрдирдГ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ

рдПрдХ рдзреАрдореА рд░реАрд▓реЛрдб рдФрд░ рд╕рдордЭрджрд╛рд░ рдбреЗрд╡рд▓рдкрд░ рдЯреНрд░реЗрдбрдСрдлрд╝ рд╣реИ рдореИрдВ рдПрдХ рдЯреЗрд╕реНрдЯ рд░рди рд╕реЗ рдорд┐рд▓реАрд╕реЗрдХрдВрдб (рдпрд╛ рд╕реЗрдХрдВрдб) рдХреЛ рдЯреБрдХрдбрд╝рд╛ рдХрд░ рджреВрдВрдЧрд╛ред

рд╕рд╛рде рд╣реА, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, npm-watch рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ (рдпрд╣ рдиреЛрдбрдореЙрди рд▓рдкреЗрдЯрддрд╛ рд╣реИ) рддрд╛рдХрд┐ рдЖрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдирдкреАрдПрдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ watch https://www.npmjs рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВ mongoose.modelNames() рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдореЙрдбрд▓ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдореЙрдбрд▓ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ mocha --watch рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рддреЛ рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:

mongoose.modelNames().indexOf("User") === -1 //if my model has not been compiled...
 ? mongoose.model("User", UserSchema) //...compile model and return it
 : mongoose.connection.model("User"); //else it is already compiled, so return this model

рдЕрдм рдЖрдк рдЗрд╕реЗ module.exports рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВ ("рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдХреЛ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ, рдФрд░ UserSchema рдХреЛ рдЖрдкрдХреА рд╕реНрдХреАрдорд╛ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреЗ рд╕рд╛рде) рдФрд░ рдЬрдм рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддреЛ рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред

https://stackoverflow.com/a/49806603/5674976

@remicastaing рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж!

рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛рдУрдВ рдкрд░, models рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ

after((done) => {
  Object.keys(mongoose.models).forEach((k) => {
    delete mongoose.models[k];
  });
  Object.keys(mongoose.modelSchemas).forEach((k) => {
    delete mongoose.modelSchemas[k];
  });
  mongoose.connection.close();
  done();
});

mocha --watch рдХреЛ describe рдмрд╛рд╣рд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╛рдиреА рдЖрдкрдХреА рд╕реНрдХреАрдорд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдХреБрд╢рд▓, рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг, рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рддрд░реАрдХрд╛ рдЬреЛ рдбреАрдмреА рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ, рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЗ рдмрд╛рд╣рд░ рдЕрдкрдирд╛ рдХрдиреЗрдХреНрд╢рди, рд╕реНрдХреАрдорд╛ рдФрд░ рдореЙрдбрд▓ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг (рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ) рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдореЙрдбрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдореЗрд░реЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдХреЛрдб рдмрд╣реБрдд DRY рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

const expect = require("chai").expect;
const mongoose = require("mongoose"),
  UserSchema = require("../data/models/User");
const connection = mongoose.createConnection(
  process.env.MONGO_URL || "mongodb://127.0.0.1/test"
);
const User = connection.model("User", UserSchema);

describe("Database Testing", function() {
  it("MongoDB is working and repeatedly testable", function(done) {
    let user = User({
      username: "My user"
    });

    user
      .save()
      .then(doc => {
        console.log(doc); // This outputs the doc.
        expect(doc.username).to.equal("My user");
        done();
      })
      .catch(err => {
        console.error(err);
        expect(err).to.be.null;
        done();
      });
  });
});

../data/models/User.js

let mongoose = require("mongoose");

let UserSchema = new mongoose.Schema({
  username: String
});
module.exports = UserSchema; // 

рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреЛ рд▓реЗрдХрд░ рдЕрд╕рдордВрдЬрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рд╣рддрд╛ рдерд╛ рдХрд┐ MongoDb рдиреЗ рдЕрдкрдиреЗ рдХрдиреЗрдХреНрд╢рди, рд╕реНрдХреАрдорд╛ рдФрд░ рдореЙрдбрд▓ рдХреИрд╕реЗ рдмрдирд╛рдПред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЖрдк рдПрдХ рдореЙрдбрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (obvред рд▓реЗрдХрд┐рди...)

рдореИрдВрдиреЗ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдпрд╛ рдЬрд┐рд╕рдиреЗ рд╕реНрдХреАрдорд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рдореЙрдбрд▓ рд▓реМрдЯрд╛рдпрд╛ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдерд╛ рдХрд┐ рдЕрдЧрд░ рдореБрдЭреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕реНрдХреАрдорд╛ рдХреЛ рдХрдИ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдХреАрдорд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╕реНрдХреАрдорд╛ рдХреА рдХрдИ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдХреЛрдИ рдмреНрдпреВрдиреЛ рдирд╣реАрдВ рд╣реИрдВред

рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рдзрд╛рди (рдЬреЛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрдо рдХреБрд╢рд▓рддрд╛ рд╕реЗ) рдХреНрдпрд╛ рдЖрдкрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдЕрдХреНрд╕рд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдирдпрд╛ рдореЙрдбрд▓ рдмрдирд╛рдпрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдордЭ рд╣реИ рдХрд┐:

  • рдореЛрдЪрд╛ --рд╡реЙрдЪ describe рдмрд╛рд╣рд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХреБрдЫ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
  • рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдХрдиреЗрдХреНрд╢рди, рд╕реНрдХреАрдорд╛ рдФрд░ рдореЙрдбрд▓ рдХрд╛ рдХрдИ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕реЗ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред

рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдореЗрд░рд╛ рдХрдо рдХреБрд╢рд▓, рдореВрд▓ рддрд░реАрдХрд╛ рд╣реИред

./test/db.spec.js

const expect = require("chai").expect;
const mongoose = require("mongoose"),

  // mocha --watch does not rerequire anything
  // outside of the test suite ("describe").
  // Define your Schemas and models separately, so
  // that you can define your Schema once above
  // your test suites, and your models many times
  // when testing. 
  UserSchema = require("../data/models/User");

describe("mongoose strangeness", function() {
  var connection = mongoose.createConnection(
    process.env.MONGO_URL || "mongodb://127.0.0.1/test"
  );

  // I tried the beforeEach and afterEach, but this wasn't needed:

  // beforeEach(function(done) {
  //   connection = mongoose.createConnection(
  //     process.env.MONGO_URL || "mongodb://127.0.0.1/test"
  //   );
  //   connection.once("open", function() {
  //     done();
  //   });
  // });

  // afterEach(function(done) {
  //   connection.close(function() {
  //     done();
  //   });
  // });

  it("MongoDB testable", function(done) {
    let User = connection.model("User", UserSchema);

    let user = User({
      username: "My user"
    });

    user
      .save()
      .then(doc => {
        console.log(doc); // This outputs the doc every time.
        expect(doc.username).to.equal("My user");
        done();
      })
      .catch(err => {
        console.error(err);
        expect(err).to.be.null;
        done();
      });
  });
});

рд╣реИрдкреНрдкреА рдореЛрдВрдЧреЛрдбрдмрд┐рдВрдЧред

рдпрд╣ рдХреЛрдб рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

if (mongoose.modelNames().includes('Model')) {
    mongoose.deleteModel('Model');
}

mongoose.model('Model', new mongoose.Schema({ ... }));

@verheyenkoen рд╕рд╣реА рд╣реИред рдпрд╣рд╛рдВ DeleteModel рдбреЙрдХреНрд╕ рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://mongoosejs.com/docs/api/connection.html#connection_Connection -deleteModel

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

ArThoX picture ArThoX  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rohan-paul picture rohan-paul  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gustavomanolo picture gustavomanolo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

efkan picture efkan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jeneser picture jeneser  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ