OverwriteModelError with mocha 'watch'
Problem
I just updated from 3.4.0 to 3.5.1, and when 'watching' Mocha tests on a model, every time the file reloads, I get a OverwriteModelError from re-'require'ing - and I guess, redefining - the model. There must be some value in making an 'overwrite' an error, but I'm going back to 3.4.0 for now because this is too much of a pain.
Error Output
Error from re-'require'ing - and I guess, redefining - the model.
Unverified for your environment
Select your OS to check compatibility.
1 Fix
Fix OverwriteModelError in Mocha with Mongoose
The OverwriteModelError occurs because Mongoose does not allow a model to be redefined once it has been registered. When using Mocha's 'watch' feature, the test files are reloaded, causing the model to be re-required and attempted to be redefined, which leads to this error. This behavior was enforced in Mongoose 3.5.0 and later versions to prevent accidental overwrites.
Awaiting Verification
Be the first to verify this fix
- 1
Check for Existing Model Registration
Before defining a model, check if it has already been registered to prevent the OverwriteModelError. Use Mongoose's `models` object to verify if the model name exists.
javascriptconst mongoose = require('mongoose'); const modelName = 'YourModelName'; if (!mongoose.models[modelName]) { mongoose.model(modelName, yourSchema); } - 2
Use a Singleton Pattern for Model Definition
Implement a singleton pattern for your model definition to ensure that the model is only defined once and reused thereafter. This avoids redefining the model on subsequent file reloads.
javascriptlet YourModel; module.exports = function() { if (!YourModel) { YourModel = mongoose.model('YourModelName', yourSchema); } return YourModel; }; - 3
Update Mocha Configuration
If you are using Mocha's watch mode, consider adjusting your test setup to avoid reloading files that define models. You can use `--watch-extensions` to specify which file types to watch.
bashmocha --watch --watch-extensions js - 4
Clear Mongoose Models Before Tests
As a last resort, you can clear the Mongoose models before running your tests to ensure that there are no conflicts. This should be done cautiously, as it may affect other tests.
javascriptbeforeEach(() => { delete mongoose.models['YourModelName']; });
Validation
Run your Mocha tests in watch mode after applying the above changes. Ensure that the OverwriteModelError no longer appears and that all tests pass successfully.
Sign in to verify this fix
Environment
Submitted by
Alex Chen
2450 rep