Saya mencari contoh aplikasi nodejs yang menggunakan sekuel ORM.
Perhatian utama saya adalah bahwa tampaknya hampir mustahil untuk mendefinisikan model Anda dalam file js terpisah jika model-model tersebut memiliki hubungan yang kompleks satu sama lain karena memerlukan () loop ketergantungan. Mungkin orang mendefinisikan semua model mereka dalam satu file yang sangat panjang?
Saya terutama tertarik pada bagaimana model didefinisikan dan digunakan di seluruh aplikasi. Saya ingin memiliki beberapa validasi bahwa apa yang saya lakukan sendiri adalah cara "baik" untuk melakukan sesuatu.
node.js
express
sequelize.js
mkoryak
sumber
sumber
Jawaban:
Cerpen
Trik dalam hal ini adalah tidak untuk menginisialisasi model di file tetapi hanya untuk memberikan informasi yang diperlukan untuk inisialisasi dan membiarkan modul terpusat mengurus pengaturan model dan instantiasi.
Jadi langkah-langkahnya adalah:
require
pada file model Anda, muat model dari singleton saja.Cerita yang lebih panjang
Berikut adalah deskripsi yang lebih rinci tentang solusi ini dengan kode sumber yang sesuai:
http://jeydotc.github.io/blog/2012/10/30/EXPRESS-WITH-SEQUELIZE.html
EDIT: Ini adalah jawaban yang sangat lama! (baca untuk info)
Tua dan terbatas dalam banyak hal!
Pertama , seperti @jinglesthula disebutkan dalam komentar (dan saya mengalaminya juga) - ada masalah dengan memerlukan file-file itu. Itu karena
require
tidak bekerja dengan cara yang samareaddirSync
!Kedua - hubungan Anda sangat terbatas - kode tidak memberikan opsi untuk asosiasi tersebut sehingga Anda TIDAK BISA membuat
belongsToMany
karena membutuhkanthrough
properti. Anda dapat membuat assocs paling dasar.Ketiga - Anda sangat terbatas dalam hubungan model! Jika Anda membaca kode dengan cermat, Anda akan melihat bahwa relasi adalah sebuah objek, bukan sebuah Array , jadi jika Anda ingin membuat lebih dari satu asosiasi dengan tipe yang sama (seperti memiliki dua kali
belongsTo
) - Anda tidak bisa!Keempat - Anda tidak perlu benda tunggal itu. Setiap modul di nodejs adalah singleton dengan sendirinya, jadi semua ini membuat cukup kompleks tanpa alasan.
Anda harus melihat jawaban Farm! (Tautan ke artikel rusak, tetapi saya akan memperbaikinya dengan sampel resmi ini dari sekuel: https://github.com/ followingelize/express-example/blob/master/models/index.js - Anda dapat menelusuri seluruh proyek untuk mendapatkan ide tentang apa yang terjadi).
ps saya mengedit posting ini karena sangat tervvotikasi sehingga orang bahkan tidak akan melihat jawaban baru (seperti yang saya lakukan).
Sunting: Baru saja mengubah tautan ke salinan dari pos yang sama, tetapi di Halaman Github
sumber
require
modul d di node dalam arti tunggal karena kode di dalamnya dieksekusi sekali dan kemudian di-cache, sehingga lain kali Anda membutuhkannya Anda mendapatkan referensi objek yang di-cache. Bukankah ini gambaran keseluruhannya?SequelizeJS memiliki artikel di situs web mereka yang memecahkan masalah ini.
Tautan rusak, tetapi Anda dapat menemukan proyek sampel yang berfungsi di sini dan menjelajahinya. Lihat jawaban yang diedit di atas untuk melihat mengapa ini adalah solusi yang lebih baik.
Ambil dari artikel:
models / index.js
Gagasan dari file ini adalah untuk mengkonfigurasi koneksi ke database dan untuk mengumpulkan semua definisi Model. Setelah semuanya ada, kami akan memanggil metode yang terkait pada masing-masing Model. Metode ini dapat digunakan untuk mengaitkan Model dengan orang lain.
sumber
sequelize
variabel dalam file model Anda, Anda dapat mengakses model lain dengansequelize.models.modelName
.Saya telah membuat paket sequelize-connect untuk membantu orang menangani masalah ini. Ini mengikuti konvensi Sequelize disarankan di sini: http://sequelize.readthedocs.org/en/1.7.0/articles/express/
Selain itu ia juga berfungsi sedikit lebih mirip Mongoose dalam hal antarmuka. Ini memungkinkan Anda untuk menentukan serangkaian lokasi di mana model Anda berada dan juga memungkinkan Anda untuk menentukan fungsi pencocokan khusus untuk mencocokkan file model Anda.
Penggunaannya pada dasarnya seperti ini:
Kemudian Anda dapat mengakses model dan sekuel seperti:
Semoga ini bisa membantu seseorang.
sumber
Saya mulai menggunakan Sequelize di aplikasi Express.js. Tak lama kemudian, muncul masalah sifat yang Anda gambarkan. Mungkin aku tidak begitu mengerti Sequelize, tetapi bagiku melakukan banyak hal lebih dari sekadar memilih dari satu meja tidak terlalu nyaman. Dan di mana biasanya Anda akan menggunakan pilih dari dua tabel atau lebih, atau penyatuan dalam SQL murni, Anda harus menjalankan pertanyaan terpisah, dan dengan sifat async dari Node itu hanya menambah kompleksitas.
Karena itu saya pindah dari menggunakan Sequelize. Selain itu saya beralih dari menggunakan data APA SAJA mengambil dari DB dalam model. Menurut pendapat saya lebih baik abstrak untuk mendapatkan data sepenuhnya. Dan alasannya - bayangkan Anda tidak hanya menggunakan MySQL (dalam kasus saya, saya menggunakan MySQL dan MongoDB berdampingan), tetapi Anda bisa mendapatkan data dari penyedia data apa pun dan metode transportasi apa pun, misalnya SQL, no-SQL, sistem file, API eksternal, FTP, SSH dll. Jika Anda mencoba melakukan semua itu dalam model, Anda akhirnya akan membuat kode yang rumit dan sulit dipahami yang akan sulit untuk ditingkatkan dan didebug.
Sekarang apa yang ingin Anda lakukan adalah untuk memiliki model mendapatkan data dari lapisan yang tahu di mana dan bagaimana untuk mendapatkannya, tapi model Anda hanya menggunakan metode API, misalnya
fetch
,save
,delete
dll Dan di dalam lapisan ini Anda memiliki implementasi spesifik untuk penyedia data tertentu. Misalnya, Anda dapat meminta data tertentu dari file PHP di komputer lokal atau dari Facebook API atau dari Amazon AWS atau dari dokumen HTML jarak jauh, dll.PS beberapa ide ini dipinjam dari Architect oleh Cloud9 : http://events.yandex.ru/talks/300/
sumber
fetch
,save
,delete
dll di luarSequelize
mengingat bahwa kerangka sudah menyediakan sarana. Itu lebih bagus, tetapi kurang nyaman untuk memiliki lapisan pengambilan yang terpisah. Pada saat yang sama, Anda mungkin bisa menambahkan lapisan abstraksi mengambil sekitar Sequelize tetapi kemudian solusinya lebih rumit, untuk kemenangan yang bisa diperdebatkan.Saya mengaturnya seperti yang dijelaskan Farm dan dokumentasi.
Tapi saya mengalami masalah tambahan bahwa dalam metode instance saya dan metode kelas yang akan saya lampirkan ke model di setiap fungsi saya akan memerlukan file indeks untuk mendapatkan objek database lainnya.
Memecahkannya dengan membuatnya dapat diakses oleh semua model.
Dan dalam file model
Saya hanya melakukan ini untuk metode kelas tetapi Anda juga bisa melakukan hal yang sama misalnya metode.
sumber
Saya mengikuti panduan resmi: http://afterelizejs.com/heroku , yang memiliki folder model, mengatur setiap modul dalam file terpisah, dan memiliki file indeks untuk mengimpornya dan mengatur hubungan di antara mereka.
sumber
Contoh model melakukan sekuel
sumber
Anda dapat mengimpor model dari file lain dengan
sequelize.import
http://afterelizejs.com/documentation#models-importDengan begitu Anda dapat memiliki satu modul tunggal untuk sekuel, yang kemudian memuat semua model lainnya.
Sebenarnya jawaban ini sangat mirip dengan jawaban user1778770.
sumber
Anda mungkin tertarik untuk melihat solusi boilerplate PEAN.JS.
Proyek PEAN adalah cabang dari proyek MEAN.JS (jangan dikelirukan dengan MEAN.IO atau tumpukan MEAN generik ).
PEAN menggantikan MongoDB dan Mongoose ORM dengan PostgreSQL dan Sequelize. Manfaat utama dari proyek MEAN.JS adalah organisasi yang disediakannya untuk tumpukan yang memiliki banyak bagian bergerak.
sumber
Anda juga dapat menggunakan suntikan ketergantungan yang memberikan solusi elegan untuk ini. Ini satu https://github.com/justmoon/reduct
sumber