初心者のnodejs一:ExpressのAPIに酔われないようにしてください.
31486 ワード
初学nodejs
このシリーズは入門シリーズではありません.実は私はまだ入門していません.入門するなら、皆さんにオススメです.
1 一緒にnodejsを勉強します.
2 BYVoid大神の『Node.js開発ガイド』大神さんが書いた教程ですが、疑問を持って見に行きます.
このシリーズは主にいくつかの話をしています.私が初めてnodejsを勉強した時、迷ったところです.困っていますので、たまに深く研究します.だから、初心者といっても、簡単ではないかもしれません.
第一篇:ExpressのAPIに酔われないようにしてください.
今nodeを学んで、Expressを注文しに来ないで、すべて人に挨拶することができません.しかし、私は先ほど接触した時、APIが多いと感じました.混乱しています.しょうがないです.脳の容量が足りないです.でも、地下鉄というものがあります.いろいろなことが分かりたいです.
まず一番簡単なnode版hello worldをください.
Expressを使ったコードを見てみます.
expressの内部には、関数の配列があり、この配列taskと呼ばれています.各要求expressの内部では、順番にこの配列の関数を実行します.この関数配列には、各関数の署名が次のようになると考えられます.
典型的なexpressを使ったap.jsに対して、以下のようなことをしました.
1.関連モジュールの導入2.var ap=express()を実行した後、.ap.setを用いてexpress内部のいくつかのパラメータ(options) を設定する.は、app.useを用いて関数を登録し、そのtaskの配列にプッシュ操作すると簡単に考えられます.
3.http.creat Serverを通じてapで要求を処理する試験1.expressにカスタム関数を登録する
expressに登録した関数は、満足する必要があります.
1.次のようになる
第1点について、コードを書けばいいです.
もう一つ:
二next()の動作原理をテストします.
全体の処理要求のモデルはまだ簡単です.上の過程を理解した後、expressを利用しないで、自分で上の過程を実現できますか?主にnext()のブロックをどのように処理しますか?
簡単に実現できると書いてありますが、テストは利用できます.ここで皆さんと議論します. 5行目 あの関数は短いですが、時間がかかりました.
もちろん、もっと深いステップをするなら、元のコードを見に行きます.実はこの部分の主なコードはconnectの中にあります.connect/lib/proto.jsのソースファイルの中で、主にap.useとap.handleの二つの関数の中にあります.
訂正:
上に述べたように、ユーザー定義の関数は二つの条件を満たすべきです.一般的にはそうです.しかし、両方とも満足できないこともあります.例えば、ユーザー定義の関数は4パラメータのもので、最後に汎用のerror処理をします.下の2つの後に.
このシリーズは入門シリーズではありません.実は私はまだ入門していません.入門するなら、皆さんにオススメです.
1 一緒にnodejsを勉強します.
2 BYVoid大神の『Node.js開発ガイド』大神さんが書いた教程ですが、疑問を持って見に行きます.
このシリーズは主にいくつかの話をしています.私が初めてnodejsを勉強した時、迷ったところです.困っていますので、たまに深く研究します.だから、初心者といっても、簡単ではないかもしれません.
第一篇:ExpressのAPIに酔われないようにしてください.
今nodeを学んで、Expressを注文しに来ないで、すべて人に挨拶することができません.しかし、私は先ほど接触した時、APIが多いと感じました.混乱しています.しょうがないです.脳の容量が足りないです.でも、地下鉄というものがあります.いろいろなことが分かりたいです.
まず一番簡単なnode版hello worldをください.
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World
');
}).listen(1337, '127.0.0.1');
上のコードはnodejsのウェブサイトから来て、とても簡単で、お願いが来ました.createServerに送る匿名の関数でお願いを処理します.Expressを使ったコードを見てみます.
var app = express(); //... http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
対照的に、express()を実行すると、関数を返します.function(req,res){//...}
そして要求はいずれもappという関数によって処理されます.expressの内部には、関数の配列があり、この配列taskと呼ばれています.各要求expressの内部では、順番にこの配列の関数を実行します.この関数配列には、各関数の署名が次のようになると考えられます.
function(req,res){//...}
でも、実はfunction(req,res,next){//...}
このnextは、次の関数のことです.あとはテストを書いて、このnextを体験します.まずまとめてみます.典型的なexpressを使ったap.jsに対して、以下のようなことをしました.
1.関連モジュールの導入2.var ap=express()を実行した後、
expressに登録した関数は、満足する必要があります.
1.次のようになる
function(req,res,next){
//... next();
}
2.app.use(customerFun)は次の2つの前に書くapp.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
第2の点については、ルーティング後または静的リソースが要求された後に、応答を要求するライフサイクルは実質的に終了したためであり、この後に加えて要求処理を行うことは、何の意味もない.第1点について、コードを書けばいいです.
app.use(function(req,res,next){
console.log("111");
next();
});
next()を書かないと、後で登録した関数が実行されなくなりますので、試してみたら分かります.もう一つ:
app.use(function(req,res,next){
console.log('111');
next();
console.log('222');
});
app.use(function(req,res,next){
console.log("333");
next();
});
コンソールの出力の順序は、111 333 222である.二next()の動作原理をテストします.
全体の処理要求のモデルはまだ簡単です.上の過程を理解した後、expressを利用しないで、自分で上の過程を実現できますか?主にnext()のブロックをどのように処理しますか?
簡単に実現できると書いてありますが、テストは利用できます.ここで皆さんと議論します. 5行目 あの関数は短いですが、時間がかかりました.
var http = require('http');
function express(){
var funcs = [];
var expr = function(req,res){
var i = 0;
function next(){
var task = funcs[i++];
if(!task) return;
task(req,res,next);
}
next();
}
expr.use=function(f){
funcs.push(f);
}
return expr;
}
var app = express();
app.use(function(req,res,next){
console.log('haha');
next();
});
app.use(function(req,res,next){
console.log('hehe');
next();
});
app.use(function(req,res){
res.end("there is nothing happened");
});
http.createServer(app).listen('3000', function(){
console.log('Express server listening on port 3000');
});
サービスを開始したら、一つの要求ごとに、コンソールから順番にhahahaheを出力します.そして、ブラウザはthere is nothing happenedです.もちろん、もっと深いステップをするなら、元のコードを見に行きます.実はこの部分の主なコードはconnectの中にあります.connect/lib/proto.jsのソースファイルの中で、主にap.useとap.handleの二つの関数の中にあります.
訂正:
上に述べたように、ユーザー定義の関数は二つの条件を満たすべきです.一般的にはそうです.しかし、両方とも満足できないこともあります.例えば、ユーザー定義の関数は4パラメータのもので、最後に汎用のerror処理をします.下の2つの後に.
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
もう一つ追加できます app.use(function(err,req,res,next){
if(err){
// console.log(err.message);
console.log(err.stack);
res.end('404')
}
});