Was kann Node.js tun? Ich weiß immer noch nicht, welche Aspekte er verwendet, und ich habe keine Chance, mit solchen Projekten in Kontakt zu treten. Nur weil es mir gefallen hat, habe ich in meiner Freizeit eine Website und einen Backend gemacht. Ich habe eine Wahrheit zutiefst verstanden, wenn Sie eine Technologie mögen, Sie können damit spielen, aber wenn Sie sie in einem Projekt verwenden, müssen Sie einige Zeit damit verbringen, viele Probleme zu lösen.
Verwendete Techniken:
Express + Jade
SQLite + Folge
Redis
1. Über Jade
Unterstützung umfassen. Zum Beispiel: Include ./includes/header Header ist eine Teilansicht, ähnlich der ASP.NET -Benutzersteuerung.
Die Unterstützung erstreckt sich. Zum Beispiel: Erweitert ../Layout verwendet das Master -Seitenlayout.
Die für Schleife ist so einfach.
Die Codekopie lautet wie folgt:
Jedes Element in UserList (die Variable, die vom UserList -Server an das Frontend übergeben wurde)
tr
td #{item.username}
td #{item.telephone}
td #{item.email}
Wie anhängen:
Die Codekopie lautet wie folgt:
erweitert ../admin_layout
Kopf anhängen
link (rel = 'stylesheet', href = '/stylesheets/font-awesome.css')
Skript (src = '/javascripts/bootstrap.js')
Skript (src = '/javascripts/bootstrap-wysiwyg.js')
Skript (src = '/javascripts/jQuery.hotkeys.js')
Blockinhalt blockieren
Append wird alle Schritte und Stile hinter dem Kopf der Master -Seite platzieren.
2. SEITER DAS Rahmen für die Implementierung von ORM. Unterstützen Sie SQLite Mysql MongoDB
Definieren des Modells (Artikel):
Die Codekopie lautet wie folgt:
var article = sequelize.define ('article', {
Titel:{
Typ: sequelize.string,
bestätigen:{}
},
Inhalt: {Typ: sequelize.String, validate: {}},
Symbol: {Typ: sequelize.String, validate: {}},
iCONNAME: {Typ: sequelize.string},
Sequenzierung: {Typ: sequelize.String, validieren: {}}
}, {
ClassMethods: {
// Artikelklassifizierung
getCountall: function (objfun) {
} // End GetCountall
} // Klassenmethoden beenden
});
Artikel.BelongSto (Kategorie);
Artikel.BelongSto (Kategorie); Jeder Artikel hat eine Kategorie.
Ich habe die Paging-bezogenen Methoden bis zum Zeitpunkt der Initialisierung der Folge geschrieben. Auf diese Weise gibt es diese Methode (PageOffset, Pagelimit) bei der Definition jedes Modells.
Die Codekopie lautet wie folgt:
var sequelize = new sequelize ('Datenbank', 'Benutzername', 'Passwort', {
// sqlite! Jetzt!
Dialekt: 'sqlite',
// die Speichermotor für SQLite
// - Standard ': Speicher:'
Speicher: config.sqlitepath,
definieren:{
ClassMethods: {
PageOffset: Funktion (pagenum) {
if (isnan (pagenum) || pagenum <1) {
Pagenum = 1;
}
return (pagenum - 1) * this.pagelimit ();
},
pagelimit: function () {
Rückkehr 10; // 10 Elemente werden pro Seite angezeigt
},
Gesamtseiten: Funktion (TotalNum) {
var total = parseInt ((Totalnum + this.pagelimit () - 1) / this.pagelimit ()),,
ArrayTotalpages = [];
für (var i = 1; i <= total; i ++) {
ArrayTotalpages.push (i);
}
return arraytotalpages;
}
},
Instancemethods: {
}
}
});
verwenden:
Die Codekopie lautet wie folgt:
Artikel.FindandCountall ({include: [Kategorie], Offset: article.pageOffset (req.query.pagenum), Grenze: article.pagelimit ()}). Erfolg (Funktion (zeile) {
res.render ('article_list', {
Titel: 'Artikelmanagement',
Articlelist: Row.Rows,
Seiten: {
Insgesamt: article.totalpages (row.count),
aktuelle Seite: req.query.pagenum,
Router: 'Artikel' '
}
});
});
Speichern Sie das Modell:
Die Codekopie lautet wie folgt:
exports.add = function (req, res) {
var form = new formidable.incomingForm ();
Form.Uploaddir = path.join (__ DirName, '../Files');
Form.KeePextensions = true;
Form.Parse (Req, Funktion (Err, Felder, Dateien) {
var // iconPath = files.icon.path,
// index = iconPath.lastIndexof ('/') <= 0? iconpath.lastindexof ('//'): iconpath.lastindexof ('/'),
icon = path.Basename (Dateien.icon.Path), // iconPath.substr (Index + 1, iconPath.length - Index),
iconName = files.icon.name;
var title = fields.titel;
id = fields.articleId;
title = fields.title,
content = fields.content,
mincontent = fields.mincontent,
Sequenzierung = Felder.sequenzierung == 0? 0: 1,
category = fields.category;
Artikel.Sync (); // Tabelle erstellen, wenn sie nicht existiert.
Category.find (Kategorie) .Success (Funktion (c) {
var article = article.build ({{{
Titel: Titel,
Inhalt: Inhalt,
Hackkontent: Hacknessel,
Symbol: Symbol,
iCONNAME: ICONNAME,
Sequenzierung: Sequenzierung
});
article.save ()
.Success (Funktion (a) {
A.SetCategory (c);
return res.redirect ('/admin/article');
});
}); // Endkategorie
});
}
Path.Basename:
Die Codekopie lautet wie folgt:
// 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),
Holen Sie sich den Dateinamen, zum Beispiel: /a/b/aa.txt => aa.txt. Zuerst habe ich die Abfangen von Zeichenfolgen verwendet, die ebenfalls implementiert werden könnten. Wenn das Betriebssystem jedoch unterschiedlich ist, wird es Probleme geben. Mac verwendet '/'. Das Folgende ist '//' im Fenster. Ich habe auch das Problem nach Abschluss der Bereitstellung entdeckt. Später fand ich heraus, dass Pfad.Abasename direkt ersetzt wurde (wenn Sie das Dokument weniger lesen, werden Sie einen Verlust erleiden). Ich habe einen guten Eindruck von Node.js, um 1 Punkt hinzuzufügen. :)
3.. REDIS -Caches fällt häufig ab und ändert selten die Daten.
Die Codekopie lautet wie folgt:
getCountall: function (objfun) {
redis.get ('articles_getCountall', Funktion (Err, Antwort) {
if (err) {
console.log (err);
zurückkehren;
}
if (Antwort === null) {
db.all ('select count (articles.categoryId) as count, category.name, categories.id aus Artikeln links Join -Kategorien zu Artikeln
redis.set ('articles_getCountall', json.stringify (row));
objfun (row);
});
}anders{
objfun (Antwort);
}
});
Diese Methode ist in der Modellschicht definiert. Da es sich ausdrückt, verwenden Sie die MVC -Methode, um so viel wie möglich zu entwickeln. Tatsächlich implementiert Route die Funktion der Controller -Schicht (Routenordner, der als Controller bezeichnet werden sollte).