Was kann node.js? Ich weiß immer noch nicht, wo es weit verbreitet ist. Ich habe keine Chance, mit solchen Projekten in Kontakt zu kommen. Nur weil es mir gefällt, habe ich in meiner Freizeit eine Website und ein Backend erstellt. Ich verstehe zutiefst, dass man mit einer Technologie experimentieren kann, wenn man sie mag, aber wenn man sie in einem Projekt verwendet, muss man einige Zeit damit verbringen, viele Probleme zu lösen.
Verwendete Technologie:
Express + Jade
sqlite + sequelize
Redis
1. Über Jade
Support inklusive. Beispiel: Der Header include ./includes/header ist eine Teilansicht, ähnlich der Benutzersteuerung von asp.net.
Der Support wird verlängert. Beispiel: „extends ../layout“ verwendet das Layout der Masterseite.
Die for-Schleife ist auch so einfach.
jedes Element in userList (userList-Variable, die vom Server an das Frontend übergeben wird)
tr
td #{item.username}
td #{item.telephone}
td #{item.email}
Bevorzugt anhängen:
erweitert ../admin_layout
Kopf anhängen
link(rel='stylesheet', href='/stylesheets/font-awesome.css')
script(src='/javascripts/bootstrap.js')
script(src='/javascripts/bootstrap-wysiwyg.js')
script(src='/javascripts/jquery.hotkeys.js')
Inhalte blockieren
Anhängen fügt alle Schritte und Stile hinter den Kopf der Masterseite ein.
2.sequelize implementiert das ORM-Framework. Unterstützt SQLite MySQL Mongodb
Definitionsmodell (Artikel):
var Article = sequelize.define('Article',{
Titel:{
Typ:Sequelize.STRING,
validieren:{}
},
Inhalt:{type:Sequelize.STRING,validate:{}},
icon:{type:Sequelize.STRING,validate:{}},
iconname:{type:Sequelize.STRING},
Sequenzierung:{type:Sequelize.STRING,validate:{}}
},{
classMethods:{
//Artikelkategorie
GetCountAll:function(objFun){
}//end getCountAll
}//end classMethods
});
Article.belongsTo(Category);
Article.belongsTo(Category); Jeder Artikel hat eine Kategorie.
Ich habe die Paging-bezogenen Methoden bei der Initialisierung von sequelize geschrieben. Auf diese Weise gibt es bei der Definition jedes Modells diese Methode (pageOffset, pageLimit).
var sequelize = new Sequelize('database', 'username', 'password', {
// sqlite! jetzt!
Dialekt: 'sqlite',
// die Speicher-Engine für SQLite
// - Standard ':memory:'
Speicher: config.sqlitePath,
definieren:{
classMethods:{
pageOffset:function(pageNum){
if(isNaN(pageNum) || pageNum < 1){
Seitennummer = 1;
}
return (pageNum - 1) * this.pageLimit();
},
pageLimit:function(){
Rückkehr 10; //每页显示10条
},
totalPages:function(totalNum){
var total =parseInt((totalNum this.pageLimit() - 1) / this.pageLimit()),
arrayTotalPages = [];
for(var i=1; i<= total; i ){
arrayTotalPages.push(i);
}
return arrayTotalPages;
}
},
Instanzmethoden:{
}
}
});
使用:
Article.findAndCountAll({include:[Category],offset:Article.pageOffset(req.query.pageNum), limit:Article.pageLimit()}).success(function(row){
res.render('article_list', {
Titel: '文章管理',
Artikelliste: row.rows,
Seiten:{
totalPages:Article.totalPages(row.count),
currentPage:req.query.pageNum,
router:'article'
}
});
});
保存模型:
exports.add = function(req, res) {
var form = new formidable.IncomingForm();
form.uploadDir = path.join(__dirname, '../files');
form.keepExtensions = true;
form.parse(req, function(err, field,files){
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 = field.title;
id = field.articleId;
Titel = Felder.Titel,
content = field.content,
mincontent = field.mincontent,
sequencing=fields.sequencing == 0 ? 0 : 1,
Kategorie = Felder.Kategorie;
Article.sync(); //如果不存在就创建表.
Category.find(category).success(function(c){
var Article = Article.build({
Titel: Titel,
Inhalt:Inhalt,
mincontent:mincontent,
icon:icon,
Symbolname:Symbolname,
Sequenzierung:Sequenzierung
});
Article.save()
.success(function(a){
a.setCategory(c);
return res.redirect('/admin/article');
});
}); //Kategorie beenden
});
}
path.basename:
//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),
获取文件名,比如:/a/b/aa.txt => aa.txt. Mac使用'/' . window下面是'\',我也是部署完成之后才发现的问题 。 后来发现path.basename 直接替换(文档阅读的少,就吃亏啊)。对node.js的好感在加加1分。:)
3. redis 缓存经常查询,而且很少变化的数据.
getCountAll:function(objFun){
redis.get('articles_getCountAll', function(err,reply){
if(err){
console.log(err);
zurück;
}
if(reply === null){
db.all('SELECT count(articles.CategoryId) as count,categories.name,categories.id FROM Articles Left Join-Kategorien auf Articles.categoryID = Kategorien.id Group by Articles.CategoryId ', function(err,row){
redis.set('articles_getCountAll',JSON.stringify(row));
objFun(row);
});
}sonst{
objFun(reply);
}
});
Diese Methode ist in der Modellebene definiert. Da es sich um Express handelt, wird es so weit wie möglich mit MVC entwickelt. Tatsächlich implementiert Route die Controller-Layer-Funktion (der Routenordner sollte Controller heißen).