3.4.0ãã3.5.1ã«æŽæ°ãããšãããã¢ãã«ã§Mochaãã¹ãããç£èŠããããšããã¡ã€ã«ããªããŒãããããã³ã«ãã¢ãã«ã®åãèŠæ±ãïŒããã³ããããåå®çŸ©ïŒããOverwriteModelErrorãçºçããŸãã
ãäžæžãããšã©ãŒãäœæããããšã«ã¯ããçšåºŠã®äŸ¡å€ãããã¯ãã§ãããããã¯éåžžã«é¢åãªã®ã§ãä»ã¯3.4.0ã«æ»ããŸãã
ããã¯ããã°ã©ãã³ã°ãšã©ãŒãåå ã§ãã åãååãšã¹ããŒãã§mongoose.model()
ãŸãã¯connection.model()
ãè€æ°ååŒã³åºããŠãããšã©ãŒã¯çºçããŸããã å¥ã®ã¹ããŒãã§ååšããã¢ãã«ã®ååãæž¡ããšããšã©ãŒãçºçããŸãã ã¢ãã«ã®äžæžãã¯å®éã«ã¯èš±å¯ãããŠããŸããã
mocha watchãã¹ããŒããåèŠæ±ãã 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.
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;
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
ã°ãŒã°ã«ã°ã«ãŒããžã®ãã©ããŒã¢ãããæçš¿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ã«æè¬ããŸãã
ãã¹ãããšã«æ°ããæ¥ç¶ãäœæãããã¢ãã«ã¯ããããã®æ¥ç¶å ã«ããŒã«ã«ã«ãã£ãã·ã¥ãããŸãã ãã1ã€ã®æ¹æ³ã§ã¯ãb / cã¢ãã«ããã¹ãããšã«ãã³ã°ãŒã¹ã¢ãžã¥ãŒã«ã¬ãã«ã§ã³ã³ãã€ã«ãããŠããããã競åãçºçããŠããŸããã
@ aheckmann-æ©é¢è»ã¢ããªã§ã¢ãã«ããã¹ãããããšãããšããã®ãšã©ãŒãçºçããŸãã
åºæ¬çã«ãåãã¹ããã¡ã€ã«ã¯before()
é¢æ°ã§Locomotiveã¢ããªãèµ·åããŸãã ã¢ããªãèµ·åãããšãmongo dbæ¥ç¶ãäœæããããã¹ãŠã®ã¢ãã«ã«èªã¿èŸŒãŸããŸããããã¯ãmongooseåæåãã¡ã€ã«ã«ãããŸãïŒã¢ããªã®èµ·åæã«1åå®è¡ãããŸãïŒã
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()
éšåã¯ãµãŒããŒãèµ·åããã ãã§ãæ§æãã¡ã€ã«ãããŒãããã€ãã·ã£ã©ã€ã¶ãŒïŒdbæ¥ç¶ã®éå§ãªã©ã®ããŸããŸãªã³ãŒããå«ããã¡ã€ã«ïŒãå®è¡ããŸãã
ããããæåã®ãã¹ããã¡ã€ã«ãçµäºããmochaã次ã®ãã¡ã€ã«ãèªã¿èŸŒãããšãããšã OverwriteModelError
ãååŸããŸãã
次ã®ãã¹ããã¡ã€ã«ãããŒããããšãã«æ¥ç¶ãéããããªãããšãšé¢ä¿ãããããã¢ãã«ãäžé©åãªæ¹æ³ã§åæåããŠããå¯èœæ§ãããããšãç解ããŠããŸãã
ãšã«ããã mongoose.disconnect
ãafter()
é¢æ°ã«è¿œå ããããšããŸããããããã¯åœ¹ã«ç«ã¡ãŸããã§ããã
éããŠããæ¥ç¶ãŸãã¯éããŠããæ¥ç¶ãšã¯äœã®é¢ä¿ããããŸããã ãã§ã«ååšããã¢ãã«ãå¥ã®ã¹ããŒãã«åå®çŸ©ããããšããŠããŸãã
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
FWIWãå°ãäºçŽ°ãªãµã³ãã«ã³ãŒãã§ã¯ããããç¹°ãè¿ãçºçããã®ãé²ãããšãã§ãããšæããŸãã ãããããåäžã®ã¢ãã«ãå®çŸ©ããå°ããªExpressã¢ããªããæ³šå ¥å¯èœãªæ¹æ³ã§æ¥ç¶ãåæåããã¢ã«çµ±åãã¹ãïŒç§ã®å Žåã¯ã¹ãŒããŒãã¹ãã䜿çšããŠããŸãããå®éã«ã¯äœã§ãïŒã¯ããã®åé¡ãããªã¬ãŒããã«æ¥ç¶ãæ³šå ¥ããŸãã
@aheckmannãç¥ã£ãŠããŠãæšæºçãªãã¿ãŒã³ãå®è£ ããããšãæ€èšããŠããã¢ããªãããå Žåã¯ã
ãããç§ãé Œã£ããã®ã§ãïŒ
https://github.com/j0ni/beachenergy.ca/blob/master/datamodel/index.js
ç§ã¯ããã奜ãã§ã¯ãããŸããããããã¯åé¡ã解決ããŸãã ãã³ã°ãŒã¹ã®ã¢ã³ããã¿ãŒã³ã䜿çšããŠããå ŽåïŒå¯èœæ§ãé«ããšæãããŸãïŒãæ£èŠã®äŸã圹ç«ã¡ãŸãã
ããã«ã¡ã¯@ aheckmann-ç§ã¯å¥ã®ã¹ããŒãã§æ°ããã¢ãã«ãäœæããŠããªããš100ïŒ ç¢ºä¿¡ããŠããŸãã ãã®åé¡ã説æããããã«ã¹ã±ã«ãã³/ãã¢ãããžã§ã¯ããäœæããŸããïŒ https ïŒ
make
ã¢ã«ãéå§ãããšãæåã«ãã¹ãã«åæ ŒããŸãã ããã§ã models/user.js
ãç·šéããŠä¿åãããšïŒããšãã°ãCTRL / CMD + SïŒãmochaã--watch
ã§å€æŽãååŸãã OverwriteModelError
ãŸãã
ããã«å¥ã®ãªãã·ã§ã³ããããŸã...ç§ã¯nodemonã䜿çšããŸãã ããã«ããããã¹ããå®è¡ããããã³ã«ããã»ã¹ãåèµ·åãããŸãã
$ nodemon --exec "mocha -Rmin"ãã¹ã
ã§ã¯ãããã«å¯Ÿããæšå¥šããã解決çã¯äœã§ããïŒ åãã¹ãã®åã«æ°ããæ¥ç¶ãäœæããŸããïŒ ã¹ããã¯ã§ãã³ã°ãŒã¹ã¢ãã«ãå®çŸ©ããèŠèŽäžã«ãšã©ãŒãçºçããªãããã«ããã«ã¯ãä»ã«ã©ã®ãããªæ¹æ³ããããŸããïŒ
ã¢ã«ã ãã§è§£æ±ºããããšè«ŠããŸããã 代ããã«ãnodemonãä»ããŠmochaãå®è¡ããŸãã ãã®ããã«ããŠãããŒãããã»ã¹ãåèµ·åãããåé¡ã解æ¶ãããŸãã
ããã¿ãŒã°ã©ã
ïŒç§ã®iPadããéä¿¡ãããã¹ãã«ãã¹ã®å¯èœæ§ããããŸã:)
+1.512.784.3232
ããã¿ãŒã [email protected]
2013幎2æ2æ¥ã«ã¯ãåå5æ41åAMã§ããªãªããŒãžã§ã»ãã»ã¢ãã·ã¥[email protected]ã¯æžããŸããïŒ
ã§ã¯ãããã«å¯Ÿããæšå¥šããã解決çã¯äœã§ããïŒ åãã¹ãã®åã«æ°ããæ¥ç¶ãäœæããŸããïŒ ã¹ããã¯ã§ãã³ã°ãŒã¹ã¢ãã«ãå®çŸ©ããèŠèŽäžã«ãšã©ãŒãçºçããªãããã«ããã«ã¯ãä»ã«ã©ã®ãããªæ¹æ³ããããŸããïŒ
â
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ããã
nodemonãä»ããŠmochaãæ£ç¢ºã«å®è¡ããã«ã¯ã©ãããã°ããã§ããïŒ ç§ã¯ãããè©ŠããŸããããããããé ãé¢ããŠããŸãïŒ
nodemon /usr/local/share/npm/bin/mocha --reporter spec --ui bdd --watch ./server/test/*.js
ç§ã䜿ãïŒ
nodemon --exec "mocha -Rmin"ãã¹ã
以äžã«ç€ºãäŸãèãããšãminã§ã¯ãªãspecã䜿çšãããµãŒããŒ/ãã¹ãã«ãã¹ããããããã§ã...ãã®å Žåã¯ããã©ã¡ãŒã¿ãŒãå€æŽããã ãã§ã...
2013幎2æ2æ¥åå7ïŒ00ãOliver [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
nodemonãä»ããŠmochaãæ£ç¢ºã«å®è¡ããã«ã¯ã©ãããã°ããã§ããïŒ ç§ã¯ãããè©ŠããŸããããããããé ãé¢ããŠããŸãïŒ
nodemon / usr / local / share / npm / bin / mocha --reporter spec --ui bdd --watch ./server/test/*.js
â
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ããã
è¯ãã§ããã --watch
ã»ã©éãã¯ãããŸããããããã«éèŠãªããšã«ãããã¯æ©èœããŸãã
ãŸããMochaãã¹ãã«å¿ èŠãªã¹ããŒãã«å€æŽãå ããããå Žåããããã¯ãã£ãã·ã¥ãããŠãããããMochaã¯ãããããªããŒãããªãããšã«æ°ä»ããŸãã:(
2013幎2æ2æ¥ã15ïŒ23ã§ããã¿ãŒGraffã®[email protected]æžããŸããïŒ
ç§ã䜿ãïŒ
nodemon --exec "mocha -Rmin"ãã¹ã以äžã«ç€ºãäŸãèãããšãminã§ã¯ãªãspecã䜿çšãããµãŒããŒ/ãã¹ãã«ãã¹ããããããã§ã...ãã®å Žåã¯ããã©ã¡ãŒã¿ãŒãå€æŽããã ãã§ã...
2013幎2æ2æ¥åå7ïŒ00ãOliver [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
nodemonãä»ããŠmochaãæ£ç¢ºã«å®è¡ããã«ã¯ã©ãããã°ããã§ããïŒ ç§ã¯ãããè©ŠããŸããããããããé ãé¢ããŠããŸãïŒ
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ç§ã®ããã«ãåããŠããŸãã ããããšãã
å€ãããã¿ãæ»ããŠç³ãèš³ãããŸãããããã³ã°ãŒã¹ã§mocha -wãå®è¡ããããšãããšåãåé¡ã«çŽé¢ããèãããããã¹ãŠã®è§£æ±ºçãè©ŠããŸããããä»ã¯å£ã«ã¶ã€ãã£ãŠããŸãã
ã©ãã«çœ®ãã°ããã®ïŒ
mongoose.models = {};
mongoose.modelSchemas = {};
ïŒ
beforeEachãafterEachãafterãbeforeïŒ
beforeEachã§mongoose.createConnectionïŒïŒãå®è¡ããafterEachã§éããå¿ èŠããããŸããïŒ
ç§ã¯å ¥ããŸãã
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');
ãã èŠããŠãããŠãã ãããç°ãªãã¿ã€ãã³ã°ã®ããã®ãã£ãã·ã¥ãããããŒãžã§ã³ã¯ãããŸããã§ãã
@asciãçµéšããããšãžã®+1ã åãã¢ãã«ãå¿ èŠã§ãããã2ã€ã®ç°ãªããã¡ã€ã«ã§å€§æåãšå°æåãç°ãªãå Žåãå¥ã®ãã¡ã€ã«ã§ããããå¿ èŠãªå Žåã¯ããäžæžãã§ããŸããããšã©ãŒãã¹ããŒãããŸãã
@iandoe mongoose.connect
ã䜿çšããŠãã¢ã«ãã¹ããè¡ããŸã
after(function(done){
mongoose.models = {};
mongoose.modelSchemas = {};
mongoose.connection.close();
done();
});
ïŒ+1 ïŒïŒ bowïŒ
ïŒ+1ïŒ
beforeEach
ã§ã¢ãã«ãäœæããå Žåã¯ã beforeEach
mongoose.model(...);
ã§ã¯ãªãã var db = mongoose.createConnection();
ã次ã«db.model(...)
æ°ããæ¥ç¶ãäœæããŸãã ã ãã®åäœã¯ããã°ã§ã¯ãªãä»æ§ã«ãããã®ã§ãã
å®è¡æã«åããŒãã§ããã³ãŒããããã®ã§ãéçºäžã«ã¹ããŒããŸãã¯ã¢ãã«é¢æ°ã«å€æŽãå ããå Žåãæ¢åã®ã¢ãã«ãäžæžãããããšæããŸãã
æ£åœãªçç±ããªãéãããªããã®ãããªããšãã§ããªãã®ãããããŸããã
äŸ
delete mongoose.models['somemodel'];
var somemodel = db.mongoose.model('somemodel', someschema);
ããã¯ç§ã«ãšã£ãŠã¯ããŸããããŸããç§ã¯ãããçŽ1幎éãã®ããã«ãã£ãŠããŸãã
ãŸãã¯ãæ¢åã®ã¢ãã«/ã¹ããŒããæ¶å»ããã«ã¹ããŒããšã¢ãã«é¢æ°ãå€æŽããæ¹æ³ããããããããŸããããç§ã¯ãã以äžèª¿æ»ããå¿ èŠã¯ãããŸããã
ç§ã¯ãã®è§£æ±ºçã圹ç«ã€ããšããããŸã
@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.
}
})
ãã®StackOverflowã®åçã¯ã次ã®ããã«è§£æ±ºããŸãã
let users
try { users = mongoose.model('users') }
catch (e) { users = mongoose.model('users', <UsersSchema...>) }
ç·šéïŒ @DanielRamosAcostaãææããŠãã
@remicastaingã«æè¬ã
ããããšã@juanpabloaj ãããã¯ç§ã®ããã«åããð
@gunaråé¡ã¯ãã¹ããŒããå€æŽãããå Žåãå€æŽãæå¹ã«ãªããªãããšã§ãã
@juanpabloajããããšã仲éïŒ
éãtry / catchãäœæãã代ããã«ãåã«äœ¿çšããŸãã
let users = mongoose.models.users || mongoose.model('users', <UsersSchema...>)
@ tomyam1 ããããããããã®ããããŒãªè§£æ±ºçãåé¡ãªãç§ãã¡ã®åé¡ã解決ããŠããããã§ã...ïŒsmileyïŒ
æè¡çã«æ£ãããœãªã¥ãŒã·ã§ã³ããã䟿å©ãªãœãªã¥ãŒã·ã§ã³ã®æ¹ãããŸãããå ŽåããããŸã:)
@ tomyam1åé¡ã解決ããããã«ååããããšã«ã€ããŠæ¥ãã¹ãããšã¯äœããããŸãããããã«è§£æ±ºçã«ã€ããŠç¬èªã®
äºãã«å©ãåãããšã¯æ¥ãã¹ãããšã§ã¯ãããŸããã 建èšçãªæçš¿ãããŠããããã¹ãŠã®äººã«æè¬ããŸãã
ãµãŒïŒgarethdown44ãfegaïŒãããã§ã¯åæããŸããã
ã¹ãã ã®äœæãé²ãããã«ãçµµæåã®åå¿ã䜿çšããŠãã ããã
ãã®ã¹ã¬ãããèŠçŽãããšïŒ
ãã®ããŒãžã«ã¯ã3ã€ã®ç°ãªããœãªã¥ãŒã·ã§ã³ãããããŸããã
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)
}
ã¢ãã«ã®å€æŽãååŸããªããããããã¯è§£æ±ºçã§ã¯ãããŸããã
mongoose.models = {};
mongoose.modelSchemas = {};
ãã®è§£æ±ºçãè©ŠããŸããããããŸããããŸããã§ãããçç±ã¯èª°ã«ãããããŸããã
ããã¯ãææžåãããŠããªãå
éšå€æ°ã®å€æŽã«äŸåããŠããŸãã
2013幎ã«ææ¡ããããšãã¯ããããæ©èœããŸãããã4幎åŸã§ãã
const Mongoose = require('mongoose');
const DB = Mongoose.createConnection(...);
const Model = DB.model("Name", schema);
@ tomyam1-ååãšããŠããªãã®èšã£ãŠããããšã«åæããŸãã ããããå ¬å¹³ãæãããã«ããã®è§£æ±ºçã¯ä»ã®ïŒããããŒãªïŒè§£æ±ºçã®2幎åŸã«æ¥ãŸãã!!
ç§ã®å Žåãnodemonãœãªã¥ãŒã·ã§ã³ãéžæããŸããã äœãèµ·ãã£ãŠããã®ãããããŠãã¹ãã³ãŒããã©ã®ããã«æ§æãããŠããã®ããç解ãããšããããã¯ç§ãããæéããªã倧ããªãªãã¡ã¯ã¿ãªã³ã°ãå¿ èŠãšããã§ãããã nodemonãœãªã¥ãŒã·ã§ã³ãææ¡ããã人ã ãããã+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
é¢æ°ãšããŠè¿ãïŒãUserããåŒæ°ã«ãUserSchemaãã¹ããŒãã®åŒæ°ã«çœ®ãæããŸãïŒãå¿
èŠã«å¿ããŠãã®é¢æ°ãåŒã³åºããŸãã
@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
以å€ã®ãã®ãå¿
èŠãšããŸãããã€ãŸããã¹ããŒããåå®çŸ©ããŸããã
ããŒã¿ããŒã¹ãžã®æ¥ç¶æ°ãæå°éã«æãããæãå¹ççã§ãšã¬ã¬ã³ãããã€ç解ãããããã¹ãæ¹æ³ã¯ããã¹ãã¹ã€ãŒãã®å€éšã§æ¥ç¶ãã¹ããŒããããã³ã¢ãã«ãã»ããã¢ããããããšã§ãã
ãã®ã³ãŒãã¯ãåãã¹ãã®åã«ã¢ãã«ãèšå®ããä»ã®äŸãšæ¯èŒãããšãéåžžã«ä¹Ÿç¥ããŠããŸãïŒç§ã«ã¯å¿ èŠãããŸããïŒã
次ã®ãã¹ãã¹ã€ãŒããæ©èœããŸãã
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ãã©ã®ããã«æ¥ç¶ãã¹ããŒããã¢ãã«ãäœæãããã«ã€ããŠæ··ä¹±ç¶æ ã«ãããŸããã 1ã€ã®ã¢ãã«ãå®çŸ©ããŠããããäœåºŠã䜿çšã§ããããšã«æ°ã¥ããŠããŸããã§ããïŒãã¡ããã§ãã...ïŒ
ããã¥ã¡ã³ãã«æ£ç¢ºã«åŸããã¹ããŒããå®çŸ©ããŠã¢ãã«ãè¿ãã¢ãžã¥ãŒã«ãäœæããŸããã
ã€ãŸãããã¹ãã§å¿ èŠã«ãªã£ãå Žåãã¹ããŒããå®çŸ©ããã¢ãžã¥ãŒã«ãåŒãç¶ãå¿ èŠã«ãªããããã¹ããŒãã¯äœåºŠãåå®çŸ©ãããŸãã ãããŠãã¹ããŒãã®è€æ°ã®å®çŸ©ã¯ããšãã§ã¯ãããŸããã
人ã ã®ãœãªã¥ãŒã·ã§ã³ïŒå¹çã¯å£ããŸããïŒã§ã¯ãåãã¹ãã®åã«æ°ããæ¥ç¶ãäœæããå€ãã®å Žåãåãã¹ãã®åã«æ°ããã¢ãã«ãäœæããŸãã
ãããããããç°¡åã«ç解ããïŒ
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();
});
});
});
幞ããªMongoDbingã
ãã®ã³ãŒãã¯ç§ã®ããã«åããŸãïŒ
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
æãåèã«ãªãã³ã¡ã³ã
å¥ã®ãªãã·ã§ã³ããããŸãïŒãã¹ãŠã®ã¢ãã«ãšã¹ããŒããããã³ã°ãŒã¹ãæé€ããŸãã
ãã¹ãã³ãŒãã«ã次ã®ãã®ãè¿œå ããŸããã
ãããŠãå°ãªããšãç§ã«ãšã£ãŠã¯åé¡ãªãåäœããŸãã