【问题标题】:Paramaters in a Node.js HTTP serverNode.js HTTP 服务器中的参数
【发布时间】:2020-05-18 14:28:56
【问题描述】:

我正在尝试制作一个类似于 express 的简单 HTTP 模块,以帮助学习如何使用 HTTP。

在使用 express 时,我经常使用以下参数:

app.get('/id/:id' (req, res) => {console.log(req.params.id); stuff})

我想知道-

  1. 是否可以只使用 HTTP?
  2. 如果仅使用 HTTP 无法完成,那么您将如何创建它?

【问题讨论】:

  • 你可以用普通的http来做,你只需要编写自己的代码来解析你的路由定义,然后将它与传入的请求匹配。由于我不考虑增值编码时间,我宁愿使用其他人编写的代码为我做这件事,并为我的应用程序逻辑节省时间。但是,如果你想自己做,你可以。

标签: node.js http server parameters


【解决方案1】:

您的问题有点令人困惑,但我认为您的意思是如何在纯 JavaScript 中实现 HTTP 路由器,而不是依赖于 express 之类的框架。

如果是这样,我会 100% 支持您的倡议!了解幕后发生的事情非常重要。

真正理解一个好方法的一个好方法是阅读已经存在的好路由器的源代码。

您可以研究 Express 路由器的源代码,但我建议您使用 find-my-way,它是一个专用路由器,您只能在没有任何其他框架的情况下使用 HTTP。

【讨论】:

    【解决方案2】:

    是的,但您需要手动处理。

    假设您使用的是 node 的 http 模块,您要查找的信息在 req.url 中,但它包含整个 url 路径。

    例如,您要解析/id/:id,而浏览器正在向http://your.server/id/100?something=something 发出请求。那么req.url 的值将是:

    /id/100?something=something
    

    但是,如果您使用net 模块从头开始编写 HTTP 模块,那么您需要知道 HTTP 请求的格式。基本上,一个 HTTP 请求看起来像一个具有以下格式的文本文件:

    GET /id/100?something=something HTTP/1.1
    Host: your.server
    

    标题部分以双换行符结尾。从技术上讲,它应该是\r\n\r\n,但\n\n 也是可以接受的。您首先需要从协议(上例中为 GET,但可以是 POST、PUT 等)和 HTTP 版本号之间的请求的第一行获取 url。

    对于任何有兴趣从头开始编写 HTTP 服务器的人,我总是推荐 James Marshall 的优秀文章:https://www.jmarshall.com/easy/http/。它最初是在 90 年代后期编写的,但直到今天我还没有找到对 HTTP 协议的更清晰的总结。我自己用它来编写我的第一个 HTTP 服务器。

    现在您必须编写代码以从字符串中提取100

    如果您是手动执行此操作,而不是尝试编写 Express 之类的框架,您可以这样做:

    const matches = req.url.match(/id\/([^\/?]+)/);
    const id = matches[1];
    

    如果你想编写一个库来解释/id/:id 模式,你可以这样做(注意:不是优化的实现,它的表达方式也略有不同):

    function matchRoute (req, route) {
        const [ urlpath, query ] = req.url.split('?'); // separate path and query
        const pathParts = urlpath.split('/');
        const routeParts = urlpath.split('/');
        let params = {};
    
        for (let i=0; i<pathParts.length; i++) {
            if (routeParts[i].match(/^:/)) { // if route part starts with ":"
                // this is a parameter:
                params[routeParts[i].replace(':','')] = pathParts[i];
            }
            else {
                if (routeParts[i] !== urlParts[i]) {
                    return false; // false means path does not match route
                }
            }
    
            // if we get here (don't return early) it means
            // the route matches the path, copy all found params to req.params:
    
            req.params = params;
            return true; // true signifies a match so we should process this route
        }
    }
    
    // Test:
    let req.url = '/id/100';
    let result = matchRoute(req, '/id/:id');
    console.log(result, req.params); // should print "true, {id:100}"
    

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 1970-01-01
      • 2022-01-13
      • 2014-11-13
      • 2012-10-11
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多