Apa yang bisa dilakukan Node.js? Saya masih tidak tahu aspek apa yang dia gunakan cukup luas, dan saya tidak punya kesempatan untuk bersentuhan dengan proyek -proyek seperti itu. Hanya karena saya menyukainya, saya membuat situs web dan backend di waktu luang saya. Saya sangat memahami satu kebenaran, jika Anda menyukai teknologi, Anda dapat bermain dengannya, tetapi jika Anda menggunakannya dalam suatu proyek, Anda harus menghabiskan waktu memecahkan banyak masalah.
Teknik yang digunakan:
Express + Jade
SQLITE + SEKTIELLION
Redis
1. Tentang Jade
Dukungan termasuk. Sebagai contoh: termasuk ./includes/Header header adalah tampilan parsial, mirip dengan kontrol pengguna ASP.NET.
Dukungan meluas. Misalnya: Extends ../Layout menggunakan tata letak halaman master.
Loop untuk sangat sederhana.
Salinan kode adalah sebagai berikut:
Setiap item di Daftar Pengguna (variabel yang diteruskan ke ujung depan oleh server Daftar Pengguna)
tr
td #{item.username}
td #{item.telephone}
td #{item.email}
Seperti ditambahkan:
Salinan kode adalah sebagai berikut:
meluas ../admin_layout
Tambahkan kepala
link (rel = 'stylesheet', href = '/stylesheets/font-aweome.css')
skrip (src = '/javascripts/bootstrap.js')
skrip (src = '/javascripts/bootstrap-wysiwyg.js')
skrip (src = '/javascripts/jQuery.hotkeys.js')
Memblokir konten
Append akan menempatkan semua langkah dan gaya di belakang kepala halaman master.
2.Enegeriisasi kerangka kerja untuk mengimplementasikan ORM. Mendukung sqlite mysql mongodb
Mendefinisikan model (artikel):
Salinan kode adalah sebagai berikut:
var artikel = sequelize.define ('artikel', {
judul:{
Jenis: Sequelize.string,
mengesahkan:{}
},
konten: {type: sequelize.string, validasi: {}},
ikon: {type: sequelize.string, validate: {}},
iconname: {type: sequelize.string},
Sequencing: {type: sequelize.string, validate: {}}
}, {
classmethods: {
// Klasifikasi Artikel
getCountall: function (objFun) {
} // end getCountall
} // end classmethods
});
Artikel.belongsto (kategori);
Artikel.belongsto (kategori); Setiap artikel memiliki kategori.
Saya menulis metode terkait paging untuk waktu ketika menginisialisasi sektor. Dengan cara ini, akan ada metode ini (PageOffset, Pagelimit) saat mendefinisikan setiap model.
Salinan kode adalah sebagai berikut:
Var Sequelize = New Sequelize ('Database', 'Username', 'Password', {
// sqlite! Sekarang!
Dialek: 'sqlite',
// mesin penyimpanan untuk sqlite
// - default ': memori:'
Penyimpanan: config.sqlitepath,
mendefinisikan:{
classmethods: {
pageOffset: function (pagenum) {
if (isnan (pagenum) || pagenum <1) {
Pagenum = 1;
}
return (pagenum - 1) * this.pagelimit ();
},
pagelimit: function () {
kembali 10; // 10 item ditampilkan per halaman
},
TotalPages: function (totalNum) {
var total = parseInt ((totalNum + this.pagelimit () - 1) / this.pagelimit ()),
arraytotalpages = [];
untuk (var i = 1; i <= total; i ++) {
arraytotalpages.push (i);
}
pengembalian arraytotalpages;
}
},
InstanceMethods: {
}
}
});
menggunakan:
Salinan kode adalah sebagai berikut:
Artikel.findandcountall ({include: [Category], Offset: artikel.pageOffset (req.query.pagenum), limit: artikel.pagelimit ()}). Success (function (row) {
res.render ('artikel_list', {
Judul: 'Manajemen Artikel',
ArticLelist: Row.rows,
Halaman: {
TotalPages: Artikel.TotalPages (Row.Count),
CurrentPage: req.query.pagenum,
Router: 'Artikel'
}
});
});
Simpan model:
Salinan kode adalah sebagai berikut:
exports.add = function (req, res) {
var Form = new paceidable.incomingform ();
Form.uploaddir = path.join (__ dirname, '../files');
Form.KeepExtensions = true;
form.parse (req, function (err, bidang, file) {
var // iconpath = file.icon.path,
// index = iconpath.LastIndexOf ('/') <= 0? iconpath.LastIndexof ('//'): iconpath.LastIndexof ('/'),
icon = path.baseName (file.icon.path), // iconpath.substr (index + 1, iconpath.length - index),
iconname = file.icon.name;
var title = fields.title;
id = fields.articleId;
title = fields.title,
konten = fields.content,
MINCONTENT = Fields.Mincontent,
Sequencing = Fields.Setencing == 0? 0: 1,
kategori = bidang.category;
Artikel.sync (); // Buat tabel jika tidak ada.
Category.find (kategori) .success (function (c) {
var artikel = artikel.build ({
Judul: Judul,
Konten: Konten,
Konten Minas: Mincing,
Ikon: Ikon,
iconname: iconname,
Sequencing: Sequencing
});
artikel.save ()
.success (function (a) {
A.SetCategory (C);
return res.redirect ('/admin/artikel');
});
}); // Kategori Akhir
});
}
Path.Basename:
Salinan kode adalah sebagai berikut:
// iconPath = file.icon.path,
// index = iconpath.LastIndexOf ('/') <= 0? iconpath.LastIndexof ('//'): iconpath.LastIndexof ('/'),
icon = <strong> path.baseName </strong> (file.icon.path), // iconpath.substr (index + 1, iconpath.length - index),
Dapatkan nama file, misalnya: /a/b/aa.txt => aa.txt. Pada awalnya saya menggunakan string intersepsi, yang juga dapat diimplementasikan, tetapi jika sistem operasi berbeda, akan ada masalah. Mac menggunakan '/'. Berikut ini adalah '//' di jendela. Saya juga menemukan masalah setelah penyebaran selesai. Kemudian saya mengetahui bahwa Path.Basename diganti secara langsung (jika Anda lebih sedikit membaca dokumen, Anda akan menderita kerugian). Saya memiliki kesan yang baik tentang Node.js untuk menambahkan 1 poin. :)
3. Redis cache sering menanyakan dan jarang mengubah data.
Salinan kode adalah sebagai berikut:
getCountall: function (objFun) {
redis.get ('artikel_getcountall', function (err, balasan) {
if (err) {
console.log (err);
kembali;
}
if (balasan === null) {
db.all ('pilih Count (artikel.categoryId) sebagai count, kategori.name, kategori.id dari artikel meninggalkan kategori bergabung pada artikel.categoryId = kategori.id grup dengan artikel.categoryid', function (err, row) {
redis.set ('artikel_getcountall', json.stringify (baris));
objfun (baris);
});
}kalau tidak{
objfun (balasan);
}
});
Metode ini didefinisikan dalam lapisan model. Karena itu diungkapkan, gunakan metode MVC untuk mengembangkan sebanyak mungkin. Bahkan, rute mengimplementasikan fungsi lapisan pengontrol (folder rute, yang harus dinamai pengontrol).