Meskipun kode Anda tidak menangani beberapa kasus kesalahan, dan menggunakan find
. yang salah fungsi, aliran umum adalah tipikal memberikan pekerjaan yang ingin Anda lakukan.
- Jika ada kesalahan selain duplikat, panggilan balik tidak akan dipanggil, yang kemungkinan akan menyebabkan masalah hilir di aplikasi NodeJs Anda
- gunakan
findOne
daripadafind
karena hanya akan ada satu hasil yang diberikan kuncinya unik. Jika tidak, itu akan mengembalikan sebuah array. - Jika panggilan balik Anda mengharapkan
error
tradisional sebagai argumen pertama, Anda bisa langsung meneruskan panggilan balik kefindOne
fungsi daripada memperkenalkan fungsi anonim. - Anda mungkin juga ingin melihat
findOneAndUpdate
pada akhirnya, tergantung pada skema dan logika akhir Anda.
Seperti yang disebutkan, Anda mungkin dapat menggunakan findOneAndUpdate
, tetapi dengan biaya tambahan.
function save(id, title, callback) {
Value.findOneAndUpdate(
{id: id, title: title}, /* query */
{id: id, title: title}, /* update */
{ upsert: true}, /* create if it doesn't exist */
callback);
}
Masih ada panggilan balik tentu saja, tetapi akan menulis data lagi jika duplikat ditemukan. Masalah apakah itu benar-benar tergantung pada kasus penggunaan.
Saya telah melakukan sedikit pembersihan kode Anda... tetapi sebenarnya cukup sederhana dan panggilan baliknya harus jelas. callback
ke fungsi selalu menerima dokumen yang baru disimpan atau yang cocok sebagai duplikat. Ini adalah tanggung jawab fungsi yang memanggil saveNewValue
untuk memeriksa kesalahan dan menanganinya dengan benar. Anda akan melihat bagaimana saya juga memastikan bahwa panggilan balik dipanggil terlepas dari jenis kesalahannya dan selalu dipanggil dengan hasil yang konsisten.
function saveNewValue(id, title, callback) {
if (!callback) { throw new Error("callback required"); }
var thisValue = new models.Value({
id:id,
title:title //this is a unique value
});
thisValue.save(function(err, product) {
if (err) {
if (err.code === 11000) { //error for dupes
return models.Value.findOne({title:title}, callback);
}
}
callback(err, product);
});
}
Atau, Anda dapat menggunakan janji pola. Contoh ini menggunakan when.js .
var when = require('when');
function saveNewValue(id, title) {
var deferred = when.defer();
var thisValue = new models.Value({
id:id,
title:title //this is a unique value
});
thisValue.save(function(err, product) {
if (err) {
if (err.code === 11000) { //error for dupes
return models.Value.findOne({title:title}, function(err, val) {
if (err) {
return deferred.reject(err);
}
return deferred.resolve(val);
});
}
return deferred.reject(err);
}
return deferred.resolve(product);
});
return deferred.promise;
}
saveNewValue('123', 'my title').then(function(doc) {
// success
}, function(err) {
// failure
});