Mongoose: Metode Pembaruan Model tidak menghormati validator

Dibuat pada 24 Apr 2012  ·  59Komentar  ·  Sumber: Automattic/mongoose

Saya dapat menggunakan metode model.Perbarui untuk memperbarui ke nilai apa pun terlepas dari batasan skema

Misalnya jika saya memiliki Skema dengan properti enum, menggunakan pembaruan saya dapat mengubah ke nilai apa pun di luar batasan enum, sehingga membatalkan set.

Perilaku yang diharapkan adalah membuat kesalahan jika nilai yang diperbarui tidak memvalidasi.

Saya menyarankan opsi tambahan untuk metode pembaruan untuk keluar pada kesalahan pertama atau tidak.

new feature

Komentar yang paling membantu

+1

Benar-benar tidak intuitif bahwa pembaruan tidak akan menggunakan: default, setter, validasi, dan enum. Apa gunanya skema jika operasi inti tidak mematuhinya.

Semua 59 komentar

Anda mungkin ingin mengaktifkan pengaturan skema strict yang akan mengabaikan jalur skema yang tidak valid dan memperbarui sisanya. tidak ada kesalahan yang dilemparkan.

Skema baru({..}, { ketat: benar })

ada permintaan tarik serupa yang menunggu untuk digabungkan yang muncul saat mengatur jalur yang tidak ada dalam skema tetapi tidak muncul selama model.update . mungkin kita harus menambahkannya ke PR di atas dan err diteruskan ke panggilan balik.

Hai sekali lagi, terima kasih atas balasan cepat Anda.

Saya tidak merujuk ke jalur yang tidak valid tetapi membatasi dalam jalur tertentu.

Ambil contoh ini

var Pengguna = Skema baru({
nama pengguna: {
jenis: Tali,
huruf kecil: benar,
trim: benar,
unik: benar
},
nama: {
jenis: Tali,
trim: benar,
diperlukan: benar,
unik: palsu,
indeks: benar
},
kata sandi: {
jenis: Tali,
diperlukan: benar,
pilih : salah,
atur: enkripsi
},
peran: {
jenis: Tali,
"default" : 'pengguna',
"enum": ['pengguna', 'admin', 'root']
},
dibuat: {
jenis: Tanggal,
"default": Tanggal.sekarang
}
}, { ketat: benar });

users.update({"username" : "test"}, {"role" : "thisShowldFail"}, function (err, val){
...
});

Perhatikan bahwa sekarang pengguna "test" memiliki peran "thisShowldFail" bahkan dengan opsi skema ketat diaktifkan.
Tidakkah Perbarui menghormati enum, dan opsi serupa lainnya?

Anda benar, itu harus memvalidasi enum. Saya pikir ada tiket untuk ini di suatu tempat.

+1, tidak dapat menggunakan #update karena masalah ini.

Apakah mungkin membiarkan .update membuat semua hal yang akan dilakukan oleh dokumen baru + .save?

  • default
  • penyetel
  • validasi khusus
  • enum

jika opsi upser digunakan, juga

  • yg dibutuhkan

tidak saat ini

Maksud saya apakah mungkin/direncanakan untuk diterapkan ...? :)

itu mungkin bagus. terkait #472

+1

Benar-benar tidak intuitif bahwa pembaruan tidak akan menggunakan: default, setter, validasi, dan enum. Apa gunanya skema jika operasi inti tidak mematuhinya.

+1

Saya suka luwak tetapi jika tidak memvalidasi pembaruan, itu kurang membantu saya. Saya memiliki dokumen besar dan saya tidak ingin mengunduhnya hanya untuk melakukan validasi.

Inilah saya yang melompat. Saya sedikit menyelam, mencoba untuk mengimplementasikannya.
Tujuannya adalah untuk mendapatkan:

  • default
  • penyetel
  • validasi
  • enum
  • yg dibutuhkan

Bahkan tidak yakin saya akan berhasil, tetapi saya akan mencobanya. Saya akan mulai dengan validator.

Semoga saya beruntung!

Merc.

+1

+1

Akan sangat bagus jika .update mendukung Validasi.

Benjolan +1

Benjolan bergelombang +1

Harap tambahkan validasi pada pembaruan!

+1

Sunting: -2 karena saya tidak berpikir luwak harus bertanggung jawab atas validasi .. Jika Anda ingin validasi, Anda harus mempertimbangkan untuk menggunakan perpustakaan khusus lainnya seperti menggunakan validasi Skema JSON yang memungkinkan

@thalesfsp Ya. Sudah dicoba di masa lalu tetapi aturan menjadi sangat miring karena tidak ada dokumen dalam memori dan rusak dalam beberapa keadaan meninggalkan perilaku tidak konsisten dan membingungkan.

keindahan sumber terbuka: jika Anda menginginkan fitur, Anda dapat menulisnya dan mengirimkan permintaan tarik dengan lulus tes dan dokumentasi yang membuktikan bahwa itu berfungsi dengan baik.

Batasan yang cukup serius. Dalam mengejar tambalan, apakah praktis untuk hanya merayapi objek Skema secara langsung untuk menentukan apakah validator harus dijalankan? Saya terutama peduli dengan validator khusus dan aturan enum yang diterapkan pada pembaruan. Kendala skema lainnya seharusnya sudah diterapkan ketika dokumen disimpan, saya pikir. Apakah penyederhanaan masalah menjadi hanya enum dan validator masuk akal dan menghilangkan kebutuhan untuk memiliki Dokumen apa pun selama pembaruan?

+1 Bump, ini akan menjadi fitur yang sangat berguna - ketika melakukan pembaruan saya ingin melihat mins/maxes dll dihormati dari skema - jika tidak, saya melakukan banyak logika boilerplate untuk sesuatu yang dapat dilakukan luwak

Akan sangat bagus untuk melihat ini terjadi. Saat ini solusi saya adalah menemukan objek, mengubah bidang dan kemudian menyimpannya, yang mengaktifkan middleware validasi. Sesuai dokumen :

Tank.findById(id, function (err, tank) {
  tank.size = 'large';
  tank.save(function (err) {
   // Document updated, do something with it
  });
});

Saya mengerti bahwa ini dibuat rumit, karena perintah update mendelegasikan langsung ke Mongo, dan dokumen lengkap tidak disimpan dalam memori untuk divalidasi. Jadi pendekatan yang disarankan oleh @BrianHoldsworth sepertinya tempat yang baik untuk memulai, menguraikan validasi yang menjalankan Skema hanya terhadap bidang yang akan diperbarui.

@aheckmann dapatkah Anda memberi kami beberapa detail lebih lanjut tentang upaya implementasi sebelumnya (gagal) sehingga siapa pun yang mencoba tambalan ini tidak membuat kesalahan yang sama lagi?

Saya terutama peduli dengan validator khusus dan aturan enum yang diterapkan pada pembaruan. Kendala skema lainnya seharusnya sudah diterapkan ketika dokumen disimpan, saya pikir. Apakah penyederhanaan masalah menjadi hanya enum dan validator masuk akal dan menghilangkan kebutuhan untuk memiliki Dokumen apa pun selama pembaruan?

@BrianHoldsworth Saya pikir ini mungkin penyederhanaan yang berlebihan. Apa yang terjadi jika bidang dengan batasan validasi required: true diperbarui menjadi string kosong? Kami membutuhkan ini untuk memicu kesalahan validasi.

Saya juga tertarik dengan ini. Mungkin sebuah plug-in dapat ditulis untuk mengganti metode .update() dan menjalankan validasi? Dengan begitu, solusi parsial pun bisa diimplementasikan. Sebaliknya, jika itu adalah inti, diharapkan untuk menangani setiap jenis validasi dan 100% kuat.

Saya telah mengalami ini juga, dengan validator dan enum khusus. Meskipun melakukan pencarian dan pembaruan dimungkinkan, hal itu membuat sangat sulit untuk menulis kode kasus umum ketika dokumen memiliki struktur sub-dokumen yang berbeda.

+1 menabrak ini.

Solusi Brian tampaknya cukup elegan. Akan senang diberi tahu saat patch mencapai beta.

+1

butuh ini +1

+1

+1

+1

+1

Dalam 3.9.3 update() akan memiliki 2 opsi khusus, setDefaultsOnInsert dan runValidators , yang akan menetapkan default dan menjalankan validator pada kueri Anda. Lihat tes misalnya, belum ada dokumen nyata :(

Terima kasih banyak - ini adalah perbaikan yang bagus!

@vkarpov15 Saya menggunakan kode Anda untuk juga menerapkan validasi ke findOneAndUpdate. Lihat PR #2393.

Hai, apakah Anda tahu kapan versi stabil 3.9 akan dirilis untuk menggunakan validasi pada pembaruan?

Terima kasih

@AlexandreAWE pertanyaan bagus. Saat ini saya sedang menyelesaikan semuanya pada 4.0 dan beta menguji cabang 3.9.x, tetapi sekarang ini adalah hal "itu akan selesai ketika sudah selesai". Saya berharap untuk memiliki RC keluar sebelum Natal.

@vkarpov15 Bagaimana

@andrewholsted menunggu driver mongodb 2.0 dan server mongodb 2.8 untuk menstabilkan - itu mudah-mudahan terjadi bulan ini, tetapi tidak dapat benar-benar mengirimkan 4.0 tanpa mendukung versi terbaru mongodb dan driver terbaru. Lihat blog saya untuk sedikit lebih detail.

Pertanyaan yang berpotensi bodoh oleh saya, tetapi mengapa tidak mengambil data yang diperbarui dan memvalidasinya terhadap skema sebelum diteruskan ke mongodb?

Juga, +1

tandai & tunggu

Tidak bisa menunggu sampai 3.9 stabil :)

Apakah fitur ini sudah masuk? Dengan sabar menunggu 3.9.. Apakah akan tersedia?

Anda dapat npm install mongoose@unstable untuk mendapatkan versi yang tidak stabil. ETA saat ini untuk 4.0 adalah 25 Maret - tempat yang baik untuk memeriksa ini adalah halaman tonggak sejarah

Baru saja mengalami masalah ini tadi malam. Senang saya bukan satu-satunya! Saya senang perubahan ini akan dirilis, terima kasih atas semua yang Anda lakukan!

+1

Tidak tahu mengapa masalah ini ditandai ditutup. Aku masih menghadapinya.

Saya sebenarnya tidak yakin ini berfungsi pada validasi enum untuk findOneAndUpdate(), bahkan dengan runValidators disetel ke true.

@m1cah berikan contoh yang menunjukkan apa yang Anda coba lakukan. Kami memiliki tes untuk ini dan mereka lulus ...

@vkarpov15 Saya percaya ini adalah contoh singkat yang menunjukkannya: http://code.runnable.com/VYhGbVhereIYdbst/update-validation-enum-for-mongoose-and-databases

Nah satu masalah adalah bahwa contoh di atas menggunakan luwak versi prasejarah:

root<strong i="6">@runnable</strong>:~# head node_modules/mongoose/package.json                                                                                                                 
{                                                                                                                                                                         
  "name": "mongoose",                                                                                                                                                     
  "description": "Elegant MongoDB object modeling for Node.js",                                                                                                           
  "version": "3.6.14",                                                                                                                                                    
  "author": {                                                                                                                                                             
    "name": "Guillermo Rauch",                                                                                                                                            
    "email": "[email protected]"                                                                                                                                   
  },                                                                                                                                                                      
  "keywords": [                                                                                                                                                           
    "mongodb",  

Coba perbarui ke 4.x dan itu akan berhasil.

Apakah Anda yakin ini berfungsi dengan metode enum dan findOneAndUpdate?
Pada luwak 4.2.6 tampaknya gagal, saya dapat menetapkan nilai yang buruk.

Skema:

var UserSchema = new Schema({
    first_name: {
        type: String,
        required: true,
    },
    last_name: {
        type: String,
        required: true,
    },
    email: {
        type: String,
        unique: true,
        required: true,
    },
    embededData: [{
        type: {
            type: String,
            enum: ['value1', 'value2', 'value3']
            required: true
        }
    }]
}, { strict: true });

Metode FindOneAndUpdate :

UserModel.findOneAndUpdate(
    {_id: uid}, 
    {$push: {embededData: data}}, 
    { runValidators: true }, function(err) {
});

Lalu saya bisa mendorong embededData.type = 'Panda';

Lihat pembaruan validator docs dan #2933 - update validator tidak berjalan pada $push , hanya pada $set dan $unset

+1

Sejauh yang saya bisa lihat, ini masih tidak berfungsi untuk kasus di mana Anda menggunakan validator khusus pada bidang yang merupakan array.

Misalnya, cuplikan kode ini:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/myTestDB');

var db = mongoose.connection;

db.on('error', function (err) {
console.log('connection error', err);
});
db.once('open', function () {
console.log('connected.');
});

var Schema = mongoose.Schema;
var userSchema = new Schema({
  _id : String,
  name : {
    type: [String],
    validate: {
        validator: function (str) {
            return str.length > 1
        }
    },
  }
});


var User = mongoose.model('User', userSchema);

User.findOneAndUpdate({"name": ["John", "Doe"]}, { 
  $setOnInsert: {
    name: ["John"],
  },
}, { runValidators: true, upsert: true, new: true }, function (err, data) {
  if (err) {
    return console.log(err);
  } else {
    // console.log(data.validateSync())
    return console.log('Updated', data);
  }
});

akan memungkinkan Anda untuk memperbarui pengguna agar memiliki bidang ["John"] name tanpa menimbulkan kesalahan, meskipun validator khusus yang saya sertakan secara eksplisit melarang larik nama apa pun yang panjangnya kurang dari atau sama dengan 1. validator itu sendiri berfungsi dengan baik, seperti yang dapat dilihat dari fakta bahwa jika Anda menghapus komentar pada baris console.log(data.validateSync()) , sehingga memaksa validasi untuk dilakukan, itu sebenarnya akan mengembalikan pesan kesalahan yang sesuai. Masalahnya adalah validasi ini tidak terjadi dalam panggilan findOneAndUpdate() , meskipun saya menyertakan opsi runValidators=true .

Sepertinya bug, bisakah Anda membuka masalah terpisah untuk itu?

Terima kasih

Apakah ada perbaikan yang tersedia untuk masalah di atas? @vkarpov15

@Saravanan90 tolong berhenti mengomentari masalah yang sudah lama tertutup tanpa informasi yang berarti. Buka masalah terpisah dengan contoh kode.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat