Node.js ทำอะไรได้บ้าง? ฉันยังไม่รู้ว่าเขาใช้แง่มุมใดบ้างและฉันไม่มีโอกาสได้ติดต่อกับโครงการดังกล่าว เพียงเพราะฉันชอบมันฉันสร้างเว็บไซต์และแบ็กเอนด์ในเวลาว่าง ฉันเข้าใจความจริงอย่างหนึ่งอย่างลึกซึ้งนั่นคือถ้าคุณชอบเทคโนโลยีคุณสามารถเล่นกับมันได้ แต่ถ้าคุณใช้มันในโครงการคุณต้องใช้เวลาแก้ปัญหามากมาย
เทคนิคที่ใช้:
Express + Jade
sqlite + sequelize
Redis
1. เกี่ยวกับหยก
การสนับสนุนรวมถึง ตัวอย่างเช่น: รวม ./includes/header Header เป็นมุมมองบางส่วนคล้ายกับการควบคุมผู้ใช้ ASP.NET
การสนับสนุนขยาย ตัวอย่างเช่น: ขยาย ../layout ใช้เค้าโครงหน้าหลัก
สำหรับลูปนั้นง่ายมาก
การคัดลอกรหัสมีดังนี้:
แต่ละรายการใน Userlist (ตัวแปรส่งผ่านไปยังส่วนหน้าโดยเซิร์ฟเวอร์ Userlist)
TR
td #{item.username}
td #{item.telephone}
td #{item.email}
ชอบภาคผนวก:
การคัดลอกรหัสมีดังนี้:
ขยาย ../admin_layout
ต่อท้ายหัว
link (rel = 'stylesheet', href = '/stylesheets/font-awesome.css')
สคริปต์ (src = '/javascripts/bootstrap.js')
สคริปต์ (src = '/javascripts/bootstrap-wysiwyg.js')
สคริปต์ (src = '/javascripts/jQuery.hotkeys.js')
บล็อกเนื้อหา
ผนวกจะวางขั้นตอนและสไตล์ทั้งหมดไว้ด้านหลังหัวของหน้าหลัก
2. กำหนดกรอบการทำงานสำหรับการใช้งาน ORM รองรับ sqlite mysql mongoDB
การกำหนดโมเดล (บทความ):
การคัดลอกรหัสมีดังนี้:
var article = sequelize.define ('บทความ', {
ชื่อ:{
ประเภท: Sequelize.string,
ตรวจสอบความถูกต้อง:{}
-
เนื้อหา: {type: sequelize.string, ตรวจสอบ: {}},
ไอคอน: {type: sequelize.string, ตรวจสอบ: {}},
iconname: {type: sequelize.string}
การเรียงลำดับ: {ประเภท: sequelize.string, ตรวจสอบ: {}}
-
ClassMethods: {
// การจำแนกบทความ
getCountall: ฟังก์ชั่น (objfun) {
} // สิ้นสุด getCountall
} // end classmethods
-
บทความ Belongsto (หมวดหมู่);
บทความ Belongsto (หมวดหมู่); แต่ละบทความมีหมวดหมู่
ฉันเขียนวิธีการที่เกี่ยวข้องกับการเพจจนถึงเวลาที่เริ่มต้นภาคต่อ ด้วยวิธีนี้จะมีวิธีนี้ (PageOffset, pageLimit) เมื่อกำหนดแต่ละรุ่น
การคัดลอกรหัสมีดังนี้:
var sequelize = new sequelize ('ฐานข้อมูล', 'ชื่อผู้ใช้', 'รหัสผ่าน', {
// sqlite! ตอนนี้!
ภาษา: 'sqlite'
// เครื่องมือจัดเก็บสำหรับ sqlite
// - ค่าเริ่มต้น ': หน่วยความจำ:'
ที่เก็บ: config.sqlitepath
กำหนด:{
ClassMethods: {
PageOffset: ฟังก์ชั่น (pagenum) {
if (iSnan (pagenum) || pagenum <1) {
pagenum = 1;
-
return (pagenum - 1) * this.pageLimit ();
-
pageLimit: function () {
กลับ 10; // 10 รายการจะแสดงต่อหน้า
-
TotalPages: ฟังก์ชั่น (TotalNum) {
var total = parseInt ((TotalNum + this.pageLimit () - 1) / this.pageLimit ())
ArrayTotalPages = [];
สำหรับ (var i = 1; i <= ทั้งหมด; i ++) {
arraytotalpages.push (i);
-
return arraytotalpages;
-
-
Instancemethods: {
-
-
-
ใช้:
การคัดลอกรหัสมีดังนี้:
บทความ. findandcountall ({รวม: [หมวดหมู่], ออฟเซ็ต: บทความ. papeoffset (req.query.pagenum), ขีด จำกัด : บทความ. pageLimit ()}). ความสำเร็จ (ฟังก์ชั่น (แถว) {
res.render ('article_list', {
ชื่อเรื่อง: 'การจัดการบทความ',
ArticleList: Row.Rows,
หน้า: {
TotalPages: article.totalpages (row.count),
CurrentPage: req.Query.pagenum,
เราเตอร์: 'บทความ'
-
-
-
บันทึกโมเดล:
การคัดลอกรหัสมีดังนี้:
exports.add = function (req, res) {
var form = new actidable.inomingForm ();
form.uploaddir = path.join (__ dirname, '../files');
Form.keepExtensions = true;
form.parse (req, function (err, ฟิลด์, ไฟล์) {
var // iconpath = files.icon.path
// index = iconpath.lastindexof ('/') <= 0? iconpath.astIndexof ('//'): iconpath.lastindexof ('/')
icon = path.basename (files.icon.path), // iconpath.substr (ดัชนี + 1, iconpath.length - ดัชนี),
iconname = files.icon.name;
var title = fields.title;
id = fields.articleid;
title = fields.title
content = fields.content
mincontent = fields.mincontent,
sequencing = fields.earchencing == 0? 0: 1,
หมวดหมู่ = fields.category;
บทความ. sync (); // สร้างตารางหากไม่มีอยู่
category.find (หมวดหมู่) .success (ฟังก์ชั่น (c) {
var article = article.build ({
ชื่อเรื่อง: ชื่อ
เนื้อหา: เนื้อหา
mincontent: mincontent,
ไอคอน: ไอคอน
ไอคอนชื่อ: ไอคอนชื่อ
การจัดลำดับ: การจัดลำดับ
-
บทความ Save ()
.Success (ฟังก์ชั่น (a) {
A.SetCategory (C);
return res.redirect ('/admin/admin');
-
- // สิ้นสุดหมวดหมู่
-
-
path.basename:
การคัดลอกรหัสมีดังนี้:
// iconpath = files.icon.path
// index = iconpath.lastindexof ('/') <= 0? iconpath.astIndexof ('//'): iconpath.lastindexof ('/')
icon = <strong> path.basename </strong> (files.icon.path), // iconpath.substr (ดัชนี + 1, iconpath.length - ดัชนี),
รับชื่อไฟล์ตัวอย่างเช่น: /a/b/aa.txt => aa.txt ตอนแรกฉันใช้สตริงการสกัดกั้นซึ่งสามารถนำไปใช้งานได้ แต่หากระบบปฏิบัติการแตกต่างกันจะมีปัญหา Mac ใช้ '/' ต่อไปนี้คือ '//' ในหน้าต่าง ฉันยังค้นพบปัญหาหลังจากการปรับใช้เสร็จสมบูรณ์ ต่อมาฉันพบว่า path.basename ถูกแทนที่โดยตรง (ถ้าคุณอ่านเอกสารน้อยลงคุณจะได้รับการสูญเสีย) ฉันมีความประทับใจที่ดีของ node.js เพื่อเพิ่ม 1 คะแนน -
3. Caches Redis มักจะสอบถามและไม่ค่อยเปลี่ยนแปลงข้อมูล
การคัดลอกรหัสมีดังนี้:
getCountall: ฟังก์ชั่น (objfun) {
redis.get ('articles_getcountall', ฟังก์ชั่น (err, ตอบกลับ) {
ถ้า (err) {
console.log (err);
กลับ;
-
ถ้า (ตอบ === null) {
db.all ('เลือกจำนวน (articles.categoryId) เป็น count, categories.name, categories.id จากบทความด้านซ้ายเข้าร่วมหมวดหมู่ใน aterics.categoryid = categories.id Group โดย articles.categoryid', ฟังก์ชั่น (err, row) {
redis.set ('articles_getcountall', json.stringify (แถว));
objfun (แถว);
-
}อื่น{
objfun (ตอบกลับ);
-
-
วิธีนี้ถูกกำหนดไว้ในเลเยอร์โมเดล เนื่องจากเป็นแบบด่วนใช้วิธี MVC เพื่อพัฒนาให้มากที่สุด ในความเป็นจริงเส้นทางใช้ฟังก์ชันเลเยอร์คอนโทรลเลอร์ (โฟลเดอร์เส้นทางซึ่งควรเป็นคอนโทรลเลอร์)