node.jsは何ができますか?彼がどのような側面を使用しているのかはまだ広くわからないので、そのようなプロジェクトに接触する機会はありません。気に入ったからといって、暇なときにウェブサイトとバックエンドを作りました。私は1つの真実を深く理解しています。つまり、テクノロジーが好きなら、それで遊ぶことができますが、プロジェクトでそれを使用する場合は、多くの問題を解決するために時間を費やさなければなりません。
使用されるテクニック:
Express + Jade
SQLite + Sequelize
Redis
1。ジェイドについて
サポートには含まれます。たとえば、./includes/headerヘッダーを含めることは、ASP.NETユーザーコントロールと同様の部分的なビューです。
サポートが拡張されます。例:extends ../layoutマスターページレイアウトを使用します。
forループはとてもシンプルです。
コードコピーは次のとおりです。
ユーザーリストの各アイテム(ユーザーリストサーバーによってフロントエンドに渡された変数)
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( 'article'、{
タイトル:{
タイプ:Secelize.String、
検証:{}
}、
コンテンツ:{type:sequelize.string、validate:{}}、
アイコン:{type:sequelize.string、validate:{}}、
iconname:{type:sequelize.string}、
シーケンス:{type:sequelize.string、validate:{}}
}、{
classMethods:{
//記事分類
getCountall:function(objfun){
} // getCountallを終了します
} // classMethodsを終了します
});
article.belongsto(category);
article.belongsto(category);各記事にはカテゴリがあります。
初期化された時期に、ページング関連の方法を書きました。このようにして、各モデルを定義するときにこの方法(PageOffset、PageLimit)があります。
コードコピーは次のとおりです。
var secelize = new Sequelize( 'Database'、 'username'、 'password'、{
// sqlite!今!
方言:「sqlite」、
// SQLite用のストレージエンジン
//-デフォルト ':メモリ:'
ストレージ:config.sqlitepath、
定義する:{
classMethods:{
PageOffset:function(pagenum){
if(isnan(pagenum)|| pagenum <1){
pagenum = 1;
}
return(pagenum -1) * this.pageLimit();
}、
pagelimit:function(){
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);
}
ArrayTotalPagesを返します。
}
}、
instancemethods:{
}
}
});
使用:
コードコピーは次のとおりです。
article.findandcountall({include:[category]、offset:article.pageoffset(req.query.pagenum)、limit:article.pagelimit()})。成功(function(row){
Res.Render( 'article_list'、{
タイトル:「記事管理」、
articleList:row.rows、
ページ:{
TotalPages:article.totalpages(row.count)、
CurrentPage:Req.Query.Pagenum、
ルーター:「記事」
}
});
});
モデルを保存します:
コードコピーは次のとおりです。
exports.add = function(req、res){
var form = new fordidable.incomingform();
form.uploaddir = path.join(__ dirname、 '../files');
form.keepextensions = true;
form.parse(req、function(err、fields、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 = fields.title;
id = fields.articleid;
title = fields.title、
content = fields.content、
mincontent = fields.mincontent、
sequencing = fields.sequencing == 0? 0:1、
category = fields.category;
article.sync(); //存在しない場合はテーブルを作成します。
category.find(category).success(function(c){
var article = article.build({
タイトル:タイトル、
コンテンツ:コンテンツ、
MinContent:MinContent、
アイコン:アイコン、
iconname:iconname、
シーケンス:シーケンス
});
article.save()
.success(function(a){
a.setcategory(c);
RESTREDIRECT( '/admin/article');
});
}); // endカテゴリ
});
}
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は '/'を使用します。以下はウィンドウの「//」です。展開が完了した後、問題を発見しました。後で、Path.basenameが直接交換されることがわかりました(ドキュメントを少なく読むと、損失が発生します)。 node.jsの印象が1ポイントを追加します。 :)
3. Redis Cachesは頻繁に照会し、データを変更することはめったにありません。
コードコピーは次のとおりです。
getCountall:function(objfun){
redis.get( 'article_getcountall'、function(err、reply){
if(err){
console.log(err);
戻る;
}
if(Reply === null){
db.all( 'count(count.categoryid)as count、categories.name、categories.id eft from eftives left from left from eft in categories on categoryid = categories.id categoryid'、function(err、row){
redis.set( 'article_getcountall'、json.stringify(row));
objfun(row);
});
}それ以外{
objfun(返信);
}
});
この方法は、モデル層で定義されています。 Expressであるため、MVCメソッドを使用して可能な限り開発します。実際、ルートはコントローラーレイヤー関数(ルートフォルダー、コントローラーという名前のルートフォルダー)を実装します。