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

Ingin mendapatkan kejelasan tentang struktur aplikasi NodeJS (Full JavaScript Stack)

Baiklah, ini pertanyaan yang cukup luas dan saya jelas bukan ahlinya, tapi saya akan melakukan yang terbaik di sini.

TL;DR

  • routes adalah pengontrol yang memberi tahu logika apa yang harus dijalankan saat pengguna menavigasi browser mereka ke jalur tertentu dalam aplikasi Anda, termasuk tampilan mana yang akan dirender dan data apa yang akan dikirim ke tampilan tersebut
  • models hanya itu - model data dalam aplikasi Anda
  • module.exports = memberi tahu file apa sebenarnya yang "diekspor", itulah kode yang perlu dijalankan atau dapat diakses dari file aplikasi utama Anda.
  • require(..) termasuk modul. Anda dapat mengatur ini pada variabel sehingga Anda dapat memanggil fungsi modul nanti, atau cukup menjalankan fungsi jika hanya itu module.exports kembali.

Menggabungkan teknik-teknik ini dapat membantu Anda mendapatkan kerangka kerja yang solid untuk semua aplikasi Anda.

Jawaban Panjang

Ekspres menyediakan kerangka kerja yang solid untuk menyusun aplikasi Node.js Anda. Node sepenuhnya independen dari Express, tetapi karena seberapa populer Express, mereka praktis berjalan beriringan. Setelah diinstal, Express dapat digunakan untuk menghasilkan proyek web scaffold (dengan opsi) untuk Anda bangun jika Anda mau.

Pengontrol

Proyek yang dihasilkan akan membuat /routes/index.js , yang (jika Anda memahami MVC) pada dasarnya adalah pengontrol utama Anda . Rute dalam ekspres ditulis sebagai berikut:

app.get('/path', function(req, res, next){ .. } );

Mari kita uraikan:variabel aplikasi kita (aplikasi) diberitahu bahwa pada permintaan GET ke '/path' untuk menjalankan fungsi panggilan balik anonim dengan req, res, next variabel (permintaan, respons, panggilan balik masing-masing). Saya merasa terbantu jika menganggap ini sebagai event handler khusus.

Penting untuk dicatat pada titik ini bahwa kita juga dapat memanggil app.post dengan sintaks yang sama untuk posting ke URL sebagai lawan dari get.

Dalam panggilan balik anonim kami, kami menangani data yang masuk dan membuat tampilan untuk pengguna. Di sinilah sebagian besar logika bisnis saya berakhir, jadi masuk akal untuk TIDAK menggunakan fungsi anonim di sini. Berikut adalah contoh panggilan balik dasar yang hanya menampilkan beranda:

app.get('/', function(req, res, next){

    //some business logic

    res.render('views/home');
});

Saat pengguna mencoba MENDAPATKAN jalur indeks aplikasi kita (/ ), kita cukup merender home . kita lihat bahwa, dari akar proyek kami, disimpan dalam views map.

Tetapi bagaimana jika kita ingin memodulasi ini sehingga kita tidak mendeklarasikan semua rute kita di app.js utama kita atau server.js ?

Kami menggunakan module.exports = .. di modul kami untuk memberi tahu server kami apa yang harus disertakan. Di pengontrol saya, saya mengekspor satu fungsi yang menggunakan aplikasi sebagai argumen dan menggunakannya untuk menentukan rute kami seperti:

Pengontrol/Pengguna.js

 module.exports = function(app){

    app.get('/users', function(req, res){
        var users = req.db.collection('users').find();
        if (!users) {
            console.log("no users found");
            res.redirect('/');
        } else {
            res.render('users/index', {users : users});
        }
    });

};

Jangan khawatir tentang req.db kode, saya melampirkan database ke permintaan di aplikasi saya tetapi itu tidak dilakukan secara default. Cukup pahami bahwa saya mendapatkan daftar 'pengguna' di sini, dan mengarahkan pengguna ke indeks aplikasi saya jika tidak ada.

Model

Mongoose memberi kita antarmuka yang bagus untuk menulis model. Dengan luwak, menulis model adalah proses tiga langkah:

  • Menentukan skema
  • Menentukan logika model
  • Buat dan ekspor model

Berikut adalah contoh User model:

Model/User.js

var mongoose = require('mongoose'),
    userSchema = new mongoose.Schema({

        name: { type: String, required: true },
        joinDate: {type: Date, default: date.now }

    }),
    User = mongoose.model('user', userSchema);

module.exports = user;

Aplikasi Server

module.exports digunakan untuk membantu kami mendefinisikan beberapa modularitas ke basis kode kami. Saat kami menjalankan aplikasi simpul, kami akhirnya menjalankan satu file JavaScript (Anda telah melihat file itu dengan server.js atau app.js ).

Agar file ini tidak menjadi terlalu besar dengan banyak model dan rute, kami menggunakan require(module) untuk memasukkan kode dari file JS lainnya. module dalam kasus kami akan menjadi jalur ke modul yang ingin kami butuhkan. Jika Anda memiliki struktur dokumen berikut:

| Controllers
    - User.js
| Models
    - User.js
| Views
app.js

Untuk menyertakan pengontrol pengguna Anda dari app.js , Anda akan menulis:require('./Controllers/User') . Karena modul pengontrol kami hanya mengekspor fungsi, kami dapat memanggil fungsi itu segera setelah pernyataan require kami hanya dengan menambahkan tanda kurung di akhir (dengan parameter apa pun yang diperlukan). Termasuk pengontrol saya terlihat seperti ini:

require('./Controllers/User')(app)

Saya meneruskan aplikasi yang sebenarnya, karena modul saya (di bawah) hanya mengekspor fungsi yang menambahkan logika bisnis ke rute aplikasi saya. Ini hanya perlu dipanggil dan tidak pernah digunakan, jadi saya tidak menangkap pengontrol saya sebagai variabel untuk memanggil metode nanti.

Menyertakan model sedikit berbeda, karena kita mungkin ingin melakukan beberapa operasi yang didefinisikan oleh model kita. Kita dapat melakukan ini dengan mengubah sedikit kode yang kita butuhkan:

var User = require('./Models/User');

Sekarang kita dapat memanggil metode model Pengguna kita kapan saja. Mongoose memberi kita banyak fungsi dasar secara gratis:

User.find({}, function(err, users){ .. });

Fungsi di atas akan mencari semua pengguna kami, dan kemudian menjalankan fungsi anonim dengan potensi err (adalah null jika tidak ada masalah) dan kemudian daftar pengguna kami dalam format JSON. Cukup bagus.

Menggabungkan semua konsep ini adalah bagaimana Anda membuat aplikasi web dasar menggunakan Express dan Node.js. Tolong beri tahu saya di komentar jika ada yang bisa saya klarifikasi tentang bagaimana saya menggunakan Express. Ini adalah pengetahuan tingkat permukaan, dan saya sarankan menggali dokumentasi dan melihat plugin untuk memperluas kemampuan aplikasi Anda. Semoga berhasil!




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tidak dapat terhubung ke MongoDB karena URI yang salah

  2. MongoDB menjalankan total seperti agregasi catatan sebelumnya hingga munculnya nilai

  3. MongoDB tidak dapat menggunakan bagian untuk melintasi elemen

  4. MongoDB membandingkan tanggal hanya tanpa waktu

  5. Rails 4 dan mongoid:secara terprogram membuat kueri dengan beberapa kondisi AND dan OR