Que peut faire Node.js? Je ne sais toujours pas quels aspects il utilise sont assez largement, et je n'ai aucune chance d'entrer en contact avec de tels projets. Juste parce que je l'ai aimé, j'ai fait un site Web et un backend pendant mon temps libre. J'ai profondément compris une vérité qui est que si vous aimez une technologie, vous pouvez jouer avec, mais si vous l'utilisez dans un projet, vous devez passer du temps à résoudre de nombreux problèmes.
Techniques utilisées:
Express + Jade
SQLite + séquelle
redis
1. À propos de Jade
Le support inclut. Par exemple: inclure ./includes/header L'en-tête est une vue partielle, similaire au contrôle utilisateur ASP.NET.
Le support s'étend. Par exemple: étend ../Layout utilise la disposition de la page maître.
La boucle pour est si simple.
La copie de code est la suivante:
Chaque élément de l'utilisateur de l'utilisateur (la variable transmise à l'avant par le serveur de liste d'utilisateurs)
tr
td # {item.username}
TD # {item.telephone}
td # {item.email}
Comme ajouter:
La copie de code est la suivante:
s'étend ../admin_layout
chef d'ajout
lien (rel = 'Stylesheet', href = '/ Stylesheets / font-awesome.css')
script (src = '/ javascripts / bootstrap.js')
script (src = '/ javascripts / bootstrap wysiwyg.js')
script (src = '/ javascripts / jquery.hotkeys.js')
Bloquer le contenu
L'ajout placera toutes les étapes et styles derrière la tête de la page maître.
2.Sullisez le cadre de mise en œuvre de l'ORM. Prise en charge de Sqlite Mysql MongoDB
Définition du modèle (article):
La copie de code est la suivante:
var Article = Sequelize.define ('Article', {
titre:{
Type: séquelize.string,
valider:{}
},
Contenu: {type: séquelize.string, valider: {}},
icône: {type: séquelize.string, valider: {}},
iconname: {type: séquelize.string},
séquençage: {type: séquelize.string, valider: {}}
}, {
ClassMethods: {
// Classification d'article
getCountall: function (objfun) {
} // fin GetCountall
} // Fin de la classe de classe
});
Article.Belongsto (catégorie);
Article.Belongsto (catégorie); Chaque article a une catégorie.
J'ai écrit les méthodes liées à la pagination au moment où l'initialisation de la séquelle. De cette façon, il y aura cette méthode (pageoffset, pagelimit) lors de la définition de chaque modèle.
La copie de code est la suivante:
var Sequelize = new Sequelize ('Database', 'Username', 'Motword', {
// sqlite! maintenant!
dialecte: «sqlite»,
// le moteur de stockage pour SQLite
// - par défaut ': mémoire:'
stockage: config.sqlitepath,
définir:{
ClassMethods: {
PageOffset: fonction (pagenum) {
if (isnan (pagenum) || pagenum <1) {
pagenum = 1;
}
return (pagenum - 1) * this.pagelimit ();
},
pagelimit: function () {
retour 10; // 10 éléments sont affichés par page
},
TotalPages: fonction (TotalNum) {
var total = parseInt ((totalnum + this.pagelimit () - 1) / this.pagelimit ()),
arraytotalPages = [];
pour (var i = 1; i <= total; i ++) {
arraytotalpages.push (i);
}
return arrayTotalPages;
}
},
instanceMethods: {
}
}
});
utiliser:
La copie de code est la suivante:
Article.FindAndCountall ({include: [Catégorie], Offset: Article.PageOffset (req.Query.pagenum), Limit: Article.Pagelimit ()}). Success (fonction (Row) {
res.render ('article_list', {
Titre: «Gestion de l'article»,
Articlelist: Row.Rows,
pages: {
TotalPages: Article.TotalPages (Row.Count),
CurrentPage: req.query.pagenum,
routeur: «Article»
}
});
});
Enregistrer le modèle:
La copie de code est la suivante:
export.add = fonction (req, res) {
var form = new formidable.incomingform ();
form.uploaddir = path.join (__ dirname, '../files');
form.keepExtensions = true;
form.parse (req, fonction (err, champs, fichiers) {
var // iconpath = files.icon.path,
// index = iconPath.LastIndexof ('/') <= 0? iconPath.LastIndexof ('//'): iconPath.LastIndexof ('/'),
icon = path.basename (files.icon.path), // iconpath.substr (index + 1, iconpath.length - index),
iconName = files.icon.name;
var title = fields.title;
id = fields.articleId;
titre = fields.title,
contenu = fields.content,
mincontent = champs.Minconttent,
séquençage = champs.sensuring == 0? 0: 1,
catégorie = fields.category;
Article.Sync (); // Créer une table si elle n'existe pas.
Catégorie.find (catégorie) .success (fonction (c) {
var article = article.build ({
Titre: Titre,
Contenu: Contenu,
Mincontent: Mincontent,
Icône: icône,
ICONNAME: ICONNAME,
séquençage: séquençage
});
Article.Save ()
.success (fonction (a) {
A.SetCategory (c);
return res.redirect ('/ admin / article');
});
}); // Catégorie de fin
});
}
path.basename:
La copie de code est la suivante:
// 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),
Obtenez le nom du fichier, par exemple: /a/b/aa.txt => aa.txt. Au début, j'ai utilisé des chaînes d'interception, qui pourraient également être implémentées, mais si le système d'exploitation est différent, il y aura des problèmes. Mac utilise '/'. Ce qui suit est «//» dans la fenêtre. J'ai également découvert le problème une fois le déploiement terminé. Plus tard, j'ai découvert que Path.Basename a été remplacé directement (si vous lisez moins le document, vous subiras une perte). J'ai une bonne impression de node.js pour ajouter 1 point. :)
3. Redis cache les caches fréquemment requêtes et modifie rarement les données.
La copie de code est la suivante:
getCountall: function (objfun) {
redis.get ('articles_getCountall', fonction (err, réponse) {
if (err) {
console.log (err);
retour;
}
if (réponse === null) {
db.all ('select count (articles.categoryId) comme nombre, catégories.name, catégories.id à partir d'articles laissés se joignent à catégories sur des articles.categoryId = catégories.id groupe par articles.categoryId', fonction (err, row) {
redis.set ('articles_getCountall', json.stringify (row));
objfun (ligne);
});
}autre{
objfun (réponse);
}
});
Cette méthode est définie dans la couche de modèle. Parce qu'il est exprimé, utilisez la méthode MVC pour vous développer autant que possible. En fait, Route implémente la fonction de couche de contrôleur (dossier de route, qui doit être nommé contrôleur).