Javascript app.listen()和app.get()如何在express和hapi上工作

Javascript app.listen()和app.get()如何在express和hapi上工作,javascript,node.js,http,express,hapijs,Javascript,Node.js,Http,Express,Hapijs,使用http节点模块(仅限本机模块)如何重新创建app.listen()和app.get()使用http模块和构造函数 var app = function(opts) { this.token= opts.token } app.prototype.get = function(callback) { // use request and response of app.listen() } app.prototype.active = function(callbac

使用http节点模块(仅限本机模块)如何重新创建app.listen()和app.get()使用http模块和构造函数

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 
}
导入模块并使用它

var app = require(...)

Var client = new app({
    token: 0000
})

client.get(function(error, reply) {})
client.listen()

在节点的HTTP模块之上构建自己的非常简单的HTTP框架非常容易。下面是我制作的一个快速示例,它实现了
app.get()
app.listen()
方法,您可以看到它是如何发展为更具表达能力的,如:

'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');
};
您可以通过几个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路径必须与路由路径完全匹配
  • 添加路由的顺序很重要(这可能会导致问题)
  • 允许有冲突的路径
  • 缺少很多好的功能,如提供文件和呈现模板(尽管您可以在处理程序中手动执行此操作)
$ 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