ماذا يمكن أن تفعل node.js؟ ما زلت لا أعرف الجوانب التي يستخدمها على نطاق واسع ، وليس لدي أي فرصة للتواصل مع مثل هذه المشاريع. لمجرد أنني أحببت ذلك ، فقد صنعت موقعًا ويبًا في وقت فراغي. لقد فهمت بعمق حقيقة واحدة ، إذا كنت تحب التكنولوجيا ، يمكنك اللعب بها ، ولكن إذا كنت تستخدمها في مشروع ، فيجب عليك قضاء بعض الوقت في حل العديد من المشكلات.
التقنيات المستخدمة:
Express + Jade
SQLite + تتمة
redis
1. حول اليشم
يشمل الدعم. على سبيل المثال: include.
يمتد الدعم. على سبيل المثال: يمتد ../layout يستخدم تخطيط الصفحة الرئيسية.
الحلقة بسيطة جدا.
نسخة الكود كما يلي:
كل عنصر في قائمة المستخدمين (تم تمرير المتغير إلى الواجهة الأمامية بواسطة خادم قائمة المستخدمين)
tr
td #{item.username}
td #{item.telephone}
td #{item.email}
مثل إلحاق:
نسخة الكود كما يلي:
يمتد ../admin_layout
إلحاق الرأس
Link (Rel = 'Stylesheet' ، Href = '/STYLESHEETS/FONT-AWOYSE.CSS')
البرنامج النصي (src = '/javaScripts/bootstrap.js')
البرنامج النصي (src = '/javaScripts/bootstrap-wysiwyg.js')
البرنامج النصي (src = '/javascripts/jquery.hotkeys.js')
حظر المحتوى
سيضع الإلحاح جميع الخطوات والأنماط خلف رأس الصفحة الرئيسية.
2. إضفاء الطابع القتلى على إطار تنفيذ ORM. دعم sqlite mysql mongodb
تحديد النموذج (المقالة):
نسخة الكود كما يلي:
var article = sequelize.define ('article' ، {
عنوان:{
النوع: sequelize.string ،
التحقق من صحة: {}
} ،
المحتوى: {type: sequelize.string ، التحقق من صحة: {}} ،
أيقونة: {type: sequelize.string ، التحقق: {}} ،
iconname: {type: sequelize.string} ،
التسلسل: {type: sequelize.string ، التحقق: {}}
} ، {
ClassMethods: {
// تصنيف المقالة
getCountall: وظيفة (objfun) {
} // end getCountall
} // end classMethods
}) ؛
article.belongsto (الفئة) ؛
article.belongsto (الفئة) ؛ كل مقالة لها فئة.
كتبت الأساليب المتعلقة بالترحيل إلى الوقت عند تهيئة التتمة. وبهذه الطريقة ، سيكون هناك هذه الطريقة (pageoffset ، pagelimit) عند تحديد كل نموذج.
نسخة الكود كما يلي:
var sequelize = new sequelize ('database' ، 'username' ، 'password' ، {
// sqlite! الآن!
لهجة: 'sqlite' ،
// محرك التخزين لـ SQLite
// - الافتراضي ": الذاكرة:"
التخزين: config.sqlitepath ،
يُعرِّف:{
ClassMethods: {
pageoffset: وظيفة (pagenum) {
if (isnan (pagenum) || pagenum <1) {
Pagenum = 1 ؛
}
العودة (pagenum - 1) * this.pagelimit () ؛
} ،
pagelimit: function () {
العودة 10 ؛ // يتم عرض 10 عناصر لكل صفحة
} ،
إجمالي صفحات: وظيفة (TotalNum) {
var total = parseint ((TotalNum + this.pagelimit () - 1) / this.pagelimit ()) ،
arraytotalpages = [] ؛
لـ (var i = 1 ؛ i <= total ؛ i ++) {
arraytotalpages.push (i) ؛
}
إرجاع arraytotalpages ؛
}
} ،
instancemethods: {
}
}
}) ؛
يستخدم:
نسخة الكود كما يلي:
article.findandcountall ({{include: [category] ، arsome: article.pageoffset (req.query.pagenum) ، limit: article.pagelimit ()}).
Res.Render ('article_list' ، {
العنوان: "إدارة المقالات" ،
articlelist: row.rows ،
الصفحات: {
TotalPages: article.totalpages (row.count) ،
Pagepage: req.query.pagenum ،
جهاز التوجيه: "مقال"
}
}) ؛
}) ؛
احفظ النموذج:
نسخة الكود كما يلي:
orports.add = function (req ، res) {
var form = new MOPIDIDABLE.INCOMINGFORM () ؛
form.uploaddir = path.join (__ dirname ، '../files') ؛
form.KeepExtensions = true ؛
form.parse (req ، function (err ، الحقول ، الملفات) {
var // iconpath = files.icon.path ،
// index = iconpath.lastindexof ('/') <= 0؟ iconpath.lastindexof ('//'): iconpath.lastindexof ('/') ،
أيقونة = path.basename (files.icon.path) ، // iconpath.substr (index + 1 ، iconpath.length - index) ،
iconname = files.icon.name ؛
var title = fields.title ؛
id = fields.articleId ؛
العنوان = fields.title ،
content = fields.content ،
mincontent = fields.mincontent ،
التسلسل = الحقول. sequencing == 0؟ 0: 1 ،
الفئة = fields.category ؛
article.sync () ؛ // إنشاء جدول إذا لم يكن موجودًا.
الفئة.
var article = article.build ({
العنوان: العنوان ،
المحتوى: المحتوى ،
mincontent: mincontent ،
أيقونة: أيقونة ،
Iconname: Iconname ،
التسلسل: التسلسل
}) ؛
article.save ()
.SSCESS (وظيفة (أ) {
A.SetCategory (C) ؛
return res.redirect ('/admin/article') ؛
}) ؛
}) ؛ // نهاية الفئة
}) ؛
}
path.basename:
نسخة الكود كما يلي:
// iconpath = files.icon.path
// index = iconpath.lastindexof ('/') <= 0؟ iconpath.lastindexof ('//'): iconpath.lastindexof ('/') ،
Icon = <strong> path.basename </strong> (files.icon.path) ، // iconpath.substr (index + 1 ، iconpath.length - index) ،
احصل على اسم الملف ، على سبيل المثال: /a/b/aa.txt => aa.txt. في البداية ، استخدمت اعتراض السلاسل ، والتي يمكن تنفيذها أيضًا ، ولكن إذا كان نظام التشغيل مختلفًا ، فستكون هناك مشاكل. يستخدم Mac '/'. ما يلي هو '//' في النافذة. لقد اكتشفت أيضًا المشكلة بعد الانتهاء من النشر. في وقت لاحق اكتشفت أن المسار. تم استبدال basename مباشرة (إذا قرأت المستند أقل ، فسوف تعاني من خسارة). لدي انطباع جيد عن node.js لإضافة نقطة واحدة. سائدا
3. Redis Caches في كثير من الأحيان الاستعلامات ونادرا ما يغير البيانات.
نسخة الكود كما يلي:
getCountall: وظيفة (objfun) {
redis.get ('articles_getCountall' ، function (err ، الرد) {
إذا (خطأ) {
console.log (err) ؛
يعود؛
}
if (الرد === null) {
db.all ('حدد العد (المقالات. categoryId) كـ count ، catevories.name ، catevories.id من المقالات اليسرى في الفئات على المقالات.
redis.set ('articles_getCountall' ، json.stringify (row)) ؛
objfun (row) ؛
}) ؛
}آخر{
objfun (الرد) ؛
}
}) ؛
يتم تعريف هذه الطريقة في طبقة النموذج. لأنه صريح ، استخدم طريقة MVC لتطوير أكبر قدر ممكن. في الواقع ، يقوم الطريق بتنفيذ وظيفة طبقة التحكم (مجلد الطريق ، الذي يجب تسميته وحدة التحكم).