【问题标题】:How app.listen() and app.get() work on express and hapiapp.listen() 和 app.get() 如何在 express 和 hapi 上工作
【发布时间】:2016-08-17 18:43:53
【问题描述】:

使用 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()

【问题讨论】:

    标签: javascript node.js http express hapijs


    【解决方案1】:

    在 Node 的 http 模块之上构建您自己的非常简单的 HTTP 框架非常容易。这是我制作的一个快速的实现 app.get()app.listen() 方法的方法,您可以看到它如何成长为更像 Express 的东西:

    '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');
    };
    

    你可以像这样使用这个迷你框架:

    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!');
    });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多