Tidak yakin apa yang saya lakukan salah, ini check.js saya
var db = mongoose.createConnection('localhost', 'event-db');
db.on('error', console.error.bind(console, 'connection error:'));
var a1= db.once('open',function(){
var user = mongoose.model('users',{
name:String,
email:String,
password:String,
phone:Number,
_enabled:Boolean
});
user.find({},{},function (err, users) {
mongoose.connection.close();
console.log("Username supplied"+username);
//doSomethingHere })
});
dan inilah insert.js saya
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/event-db')
var user = mongoose.model('users',{
name:String,
email:String,
password: String,
phone:Number,
_enabled:Boolean
});
var new_user = new user({
name:req.body.name,
email: req.body.email,
password: req.body.password,
phone: req.body.phone,
_enabled:false
});
new_user.save(function(err){
if(err) console.log(err);
});
Setiap kali saya mencoba menjalankan check.js, saya mendapatkan kesalahan ini
Tidak dapat menimpa model 'pengguna' setelah dikompilasi .
Saya memahami bahwa kesalahan ini terjadi karena ketidakcocokan Skema, tetapi saya tidak dapat melihat di mana ini terjadi? Saya cukup baru mengenal luwak dan nodeJS.
Inilah yang saya dapatkan dari antarmuka klien MongoDB saya:
MongoDB shell version: 2.4.6 connecting to: test
> use event-db
switched to db event-db
> db.users.find()
{ "_id" : ObjectId("52457d8718f83293205aaa95"),
"name" : "MyName",
"email" : "[email protected]",
"password" : "myPassword",
"phone" : 900001123,
"_enable" : true
}
>
Jawaban:
Kesalahan ini terjadi karena Anda sudah menetapkan skema, lalu Anda menetapkan skema lagi. Umumnya yang harus Anda lakukan adalah membuat instance skema satu kali, dan kemudian meminta objek global untuk memanggilnya saat diperlukan.
Sebagai contoh:
user_model.js
check.js
insert.js
sumber
ref
ke model lain, ini dapat menyebabkan mimpi buruk ketergantungan. Gunakanvar User = mongoose.model('user')
sebagai gantirequire
.Jadi Alasan Lain mengapa Anda mungkin mendapatkan Kesalahan ini adalah jika Anda menggunakan model yang sama di file yang berbeda tetapi
require
jalur Anda memiliki kasus yang berbeda. Misalnya dalam situasi saya, saya memiliki:require('./models/User')
dalam satu file dan kemudian di file lain di mana saya membutuhkan akses ke model Pengguna yang saya milikirequire('./models/user')
.Saya kira mencari modul & luwak memperlakukannya sebagai file yang berbeda. Setelah saya memastikan bahwa kasusnya cocok di keduanya, itu tidak lagi menjadi masalah.
sumber
Saya mengalami masalah ini saat pengujian unit.
Pertama kali Anda memanggil fungsi pembuatan model, luwak menyimpan model di bawah kunci yang Anda berikan (mis. 'Pengguna'). Jika Anda memanggil fungsi pembuatan model dengan kunci yang sama lebih dari sekali, luwak tidak akan membiarkan Anda menimpa model yang ada.
Anda dapat memeriksa apakah model tersebut sudah ada di luwak dengan:
Ini akan memunculkan kesalahan jika model tidak ada, sehingga Anda dapat membungkusnya dengan mencoba / menangkap untuk mendapatkan model, atau membuatnya:
sumber
try exports.getModel = ()-> mongoose.model('User', userSchema) catch err exports.getModel = ()-> mongoose.model('User')
Saya mengalami masalah ini saat 'menonton' tes. Ketika tes diedit, jam tangan menjalankan kembali tes, tetapi gagal karena alasan ini.
Saya memperbaikinya dengan memeriksa apakah modelnya ada, lalu gunakan, jika tidak buatlah.
sumber
module.export = User
menjadiexport defaults User
. Saya juga harusrefs
Pengguna dari model lain. Saya tidak yakin mengapa mengubah darimodule.exports
menjadiexport default
membawa masalah ini. Namun demikian, jawaban ini tampaknya telah memperbaikinya.mongoose.models
tidak ada, setidaknya dalam versi terbarufor (let model in mongoose.models) delete mongoose.models[model]
"test": "NODE_ENV=test mocha --file mocha.config.js --watch"
dan dalam file config js saya memilikibefore()
danafter()
untuk menangani penyiapan dan pembongkaran. @ E.Sundin memberikan solusi sempurna di sini, dan berfungsi dengan sangat baik. Terima kasih!Saya telah mengalami masalah ini & itu bukan karena definisi skema melainkan mode offline tanpa server - Saya baru saja berhasil menyelesaikannya dengan ini:
Yang disebutkan di sini https://github.com/dherault/serverless-offline/issues/258
Mudah-mudahan itu membantu orang lain yang sedang membangun proyek mereka tanpa server dan menjalankan mode offline.
sumber
module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
Jika Anda menggunakan Serverless offline dan tidak ingin menggunakan
--skipCacheInvalidation
, Anda dapat menggunakan:sumber
--skipCacheInvalidation
Jika Anda membuatnya di sini, mungkin Anda memiliki masalah yang sama dengan yang saya alami. Masalah saya adalah saya mendefinisikan model lain dengan nama yang sama . Saya menyebut galeri dan model file saya "File". Sialan Anda salin dan tempel!
sumber
Ini terjadi pada saya ketika saya menulis seperti ini:
Namun, jalur sebenarnya adalah '../myUser/User.js'
sumber
Saya menyelesaikan ini dengan menambahkan
sebelum garis:
Semoga ini menyelesaikan masalah Anda
sumber
mongoose.connection.models = {};
Untuk memecahkan ini, periksa apakah model tersebut sudah ada sebelumnya untuk melakukan pembuatan:
sumber
Saya tahu ada solusi yang diterima tetapi saya merasa bahwa solusi saat ini menghasilkan banyak boilerplate hanya sehingga Anda dapat menguji Model. Solusi saya pada dasarnya adalah membawa Anda model dan meletakkannya di dalam fungsi yang menghasilkan pengembalian Model baru jika Model belum terdaftar tetapi mengembalikan Model yang ada jika sudah.
Membuka dan menutup koneksi di semua tempat membuat frustrasi dan tidak terkompresi dengan baik.
Dengan cara ini jika saya memerlukan model dua tempat yang berbeda atau lebih khusus dalam pengujian saya, saya tidak akan mendapatkan kesalahan dan semua informasi yang benar dikembalikan.
sumber
Masalah ini mungkin terjadi jika Anda menentukan 2 skema berbeda dengan nama Koleksi yang sama
sumber
sumber
Saya memiliki masalah yang sama, alasannya adalah saya mendefinisikan skema model dalam fungsi JS, mereka harus didefinisikan secara global dalam modul node, bukan dalam fungsi.
sumber
Ada cara lain untuk mengatasi kesalahan ini.
Perlu diingat bahwa jalur ke model peka huruf besar / kecil.
Dalam contoh serupa yang melibatkan model "Kategori", kesalahan terjadi dalam kondisi berikut:
1) Pernyataan yang diminta disebutkan dalam dua file: ..category.js dan ..index.js 2) Saya yang pertama, kasusnya benar, di file kedua tidak seperti berikut:
category.js
index.js
sumber
Definisi skema harus unik untuk koleksi, tidak boleh lebih dari satu skema untuk koleksi.
sumber
karena skema Anda sudah, validasi sebelum membuat skema baru.
sumber
Anda dapat dengan mudah menyelesaikannya dengan melakukan
sumber
Saya mengalami situasi di mana saya harus membuat model secara dinamis dengan setiap permintaan dan karena itu saya menerima kesalahan ini, namun, yang saya gunakan untuk memperbaikinya menggunakan metode deleteModel seperti berikut:
Saya harap ini bisa membantu siapa saja.
sumber
sumber
Untuk semua orang yang berakhir di sini karena basis kode dengan campuran Typegoose dan Mongoose :
Buat koneksi db untuk masing-masing:
Luwak:
Jenis kambing:
sumber
Saya hanya memiliki kesalahan saat menyalin. Dalam satu baris saya memiliki nama yang sama dengan model lain (Model iklan):
Benar adalah:
Omong-omong, jika seseorang memiliki "simpan otomatis", dan gunakan indeks untuk kueri seperti:
Itu harus menghapus indeks, dan menulis ulang untuk model yang benar:
sumber
Saya memecahkan masalah ini dengan melakukan ini
Kemudian di file lainnya
Solusi yang Lebih Baik
Saya harap ini membantu...
sumber
Karena masalah ini terjadi karena memanggil model di lain waktu. Atasi masalah ini dengan membungkus kode model Anda di blok coba tangkap. kode ketikan seperti ini -
Demikian pula Anda dapat menulis kode di js juga.
sumber
Anda menggunakan mongoose.model dengan nama variabel yang sama "user" di check.js dan insert.js.
sumber
Jika Anda bekerja dengan expressjs, Anda mungkin perlu memindahkan definisi model Anda ke luar app.get () sehingga hanya dipanggil sekali ketika skrip dibuat.
sumber