MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Apa yang terjadi dengan Meteor dan Fibers/bindEnvironment()?

Anda menggunakan bindEnvironment sedikit salah. Karena tempat penggunaannya sudah ada dalam serat dan panggilan balik yang keluar dari klien Knox tidak lagi dalam serat.

Ada dua kasus penggunaan bindEnvironment (yang dapat saya pikirkan, mungkin ada lebih banyak lagi!):

  • Anda memiliki variabel global yang harus diubah tetapi Anda tidak ingin itu memengaruhi sesi pengguna lain

  • Anda mengelola panggilan balik menggunakan modul api/npm pihak ketiga (sepertinya memang demikian)

Meteor.bindEnvironment membuat Fiber baru dan menyalin variabel dan lingkungan Fiber saat ini ke Fiber baru. Poin yang Anda butuhkan adalah saat Anda menggunakan metode callback modul nom.

Untungnya ada alternatif yang menangani panggilan balik yang menunggu Anda dan mengikat panggilan balik dalam serat yang disebut Meteor.wrapAsync .

Jadi Anda bisa melakukan ini:

Fungsi startup Anda sudah memiliki fiber dan tidak ada callback sehingga Anda tidak perlu bindEnvironment di sini.

Meteor.startup(function () {
   if (Projects.find().count() === 0) {
     insertRecords();
   }
});

Dan fungsi insert record Anda (menggunakan wrapAsync) sehingga Anda tidak memerlukan callback

function insertRecords() {
  console.log("inserting...");
  var client = Knox.createClient({
    key: apikey,
    secret: secret,
    bucket: 'profile-testing'
  });
      
  client.listSync = Meteor.wrapAsync(client.list.bind(client));

  console.log("created client");
      
  try {
      var data = client.listSync({ prefix: 'projects' });
  }
  catch(e) {
      console.log(e);
  }    

  if(!data) return;


  for (var i = 1; i < data.Contents.length; i++)  {
    console.log(data.Contents[i].Key);
    if (data.Contents[i].Key.split('/').pop() == "") {
      Projects.insert({ name: data.Contents[i].Key, contents: [] });
    } else if (data.Contents[i].Key.split('.').pop() == "jpg") {
      Projects.update( { name: data.Contents[i].Key.substr(0,
                         data.Contents[i].Key.lastIndexOf('.')) },
                       { $push: {contents: data.Contents[i].Key}} );
    } else {
      console.log(data.Contents[i].Key.split('.').pop());
    }
  }      
});

Beberapa hal yang perlu diingat. Serat tidak seperti benang. Hanya ada satu utas di NodeJS.

Fiber lebih seperti event yang dapat berjalan pada saat yang sama tetapi tanpa saling memblokir jika ada skenario tipe menunggu (misalnya mendownload file dari internet).

Jadi Anda dapat memiliki kode sinkron dan tidak memblokir acara pengguna lain. Mereka bergiliran untuk berlari tetapi masih berjalan dalam satu utas. Jadi beginilah Meteor memiliki kode sinkron di sisi server, yang dapat menunggu sesuatu, namun pengguna lain tidak akan diblokir oleh ini dan dapat melakukan sesuatu karena kode mereka berjalan di serat yang berbeda.

Chris Mather memiliki beberapa artikel bagus tentang ini di http://eventedmind.com

Apa yang dilakukan Meteor.wrapAsync?

Meteor.wrapAsync mengambil metode yang Anda berikan sebagai parameter pertama dan menjalankannya di serat saat ini.

Itu juga melampirkan panggilan balik padanya (diasumsikan metode mengambil param terakhir yang memiliki panggilan balik di mana param pertama adalah kesalahan dan yang kedua hasilnya seperti function(err,result) .

Panggilan balik terikat dengan Meteor.bindEnvironment dan memblokir Fibre saat ini hingga panggilan balik diaktifkan. Segera setelah panggilan balik diaktifkan, ia mengembalikan result atau melempar err .

Jadi sangat berguna untuk mengubah kode asinkron menjadi kode sinkron karena Anda dapat menggunakan hasil metode pada baris berikutnya daripada menggunakan panggilan balik dan menyarangkan fungsi yang lebih dalam. Ini juga menangani bindEnvironment untuk Anda sehingga Anda tidak perlu khawatir kehilangan cakupan serat Anda.

Perbarui Meteor._wrapAsync sekarang Meteor.wrapAsync dan didokumentasikan.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menanyakan ukuran array internal di MongoDB

  2. Kesalahan:dokumen operasi pembaruan harus berisi operator atom, saat menjalankan updateOne

  3. Perintah Hitung MongoDB

  4. Bekerja dengan karakter khusus dalam koleksi Mongo

  5. Kompresi Awalan Indeks di MongoDB 3.0 WiredTiger