2016-04-24 5 views

答えて

1

var app = function(opts) { 
    this.token= opts.token 
} 

app.prototype.get = function(callback) { 
    // use request and response of app.listen() 
} 

app.prototype.active = function(callback) { 
    // use request and response of app.listen() 
    // return on callback some manipulate 
    //request params 
} 


app.prototype.listen = function() { 
    // start http or https server 
} 

インポートモジュールと作業は、ノードのHTTPモジュールの上に独自の非常に単純なHTTPの枠組みを構築するために非常に簡単です。

const app = new Framework({ port: 4000 }); 

app.get('/', (req, res) => { 

    res.end('Home page'); 
}); 

app.get('/about', (req, res) => { 

    res.end('About page'); 
}); 

app.listen(() => { 

    console.log('Started server!'); 
}); 

'use strict'; 

const Http = require('http'); 
const Url = require('url'); 

// Framework 

const Framework = function (options) { 

    this.options = options; 
    this.routes = []; 
    this.listener = Http.createServer(this._onRequest.bind(this)); 
}; 

Framework.prototype.get = function (path, handler) { 

    this.routes.push({ path, method: 'GET', handler }); 
}; 

Framework.prototype.post = function (path, handler) { 

    this.routes.push({ path, method: 'POST', handler }); 
}; 

Framework.prototype.listen = function (callback) { 

    this.listener.listen(this.options.port, callback); 
}; 

Framework.prototype._onRequest = function (req, res) { 

    // Find the first matching route 

    for (let i = 0; i < this.routes.length; ++i) { 
     const route = this.routes[i]; 
     const url = Url.parse(req.url); 
     if (route.method === req.method && url.path === route.path) { 
      return route.handler(req, res); 
     } 
    } 

    // No matching routes 

    res.writeHead(404); 
    res.end('Not found'); 
}; 

あなたはそうのようなこのミニフレームワークを使用することができます。ここではapp.get()app.listen()メソッドを実装し、私が作った迅速な1だ、あなたはそれがよりエクスプレスのようなものになる育つ可能性がどのように見ることができます

あなたは、いくつかのcURLのリクエストでそれをテストすることができます。

$ curl -i http://localhost:4000/ 

HTTP/1.1 200 OK 
Date: Sun, 24 Apr 2016 14:38:02 GMT 
Connection: keep-alive 
Content-Length: 9 

Home page 

$ curl -i http://localhost:4000/about 

HTTP/1.1 200 OK 
Date: Sun, 24 Apr 2016 14:38:08 GMT 
Connection: keep-alive 
Content-Length: 10 

About page 

$ curl -i http://localhost:4000/spaghetti 

HTTP/1.1 404 Not Found 
Date: Sun, 24 Apr 2016 14:38:14 GMT 
Connection: keep-alive 
Transfer-Encoding: chunked 

Not found 

明らかにこれは本当に基本的なフレームワークであり、多くのプロに苦しんでいますhapiのようなフレームワークが解決しました:

  • パスのパラメータのサポートはありません。 /users/{id}。 URLパスは正確に
  • あなたがルートを追加する順序が重要である(これは問題につながることができます)
  • 競合するパスがファイルを提供し、テンプレートをレンダリングのような素晴らしい機能(多くの不足している
  • を許可されているルート・パスと一致する必要がありますハンドラーで手動で行うこともできますが)
関連する問題