【问题标题】:What does this snippet in HTTP JSON API SERVER excercise in learnyounodeHTTP JSON API SERVER 中的这个片段在 learnyounode 中的练习是什么
【发布时间】:2016-01-16 18:14:07
【问题描述】:

上下文

我在 learnyounode

中遇到过练习
npm install -g learnyounode

调用 HTTP JSON API SERVER。 练习目标:

编写一个 HTTP 服务器,当它接收到路径“/api/parsetime”的 GET 请求时提供 JSON 数据。期望请求包含一个 以“iso”键和 ISO 格式时间作为值的查询字符串。

例如:

/api/parsetime?iso=2013-08-10T12:10:15.474Z

我无法解决它,我认为这是由于缺乏一些特定的 API 知识,所以我查找了一个解决方案,发现了这个(顺便说一句效果很好):

var http = require('http');
var url = require('url');

    function parsetime (time) {
      return {
        hour: time.getHours(),
        minute: time.getMinutes(),
        second: time.getSeconds()
      };
    }

    function unixtime (time) {
      return { unixtime : time.getTime() };
    }

    var server = http.createServer(function (req, res) {
      var parsedUrl = url.parse(req.url, true);
      var time = new Date(parsedUrl.query.iso);
      var result;

      if (/^\/api\/parsetime/.test(req.url))
        result = parsetime(time);
      else if (/^\/api\/unixtime/.test(req.url))
        result = unixtime(time);

      if (result) {
        res.writeHead(200, { 'Content-Type': 'application/json' });
        res.end(JSON.stringify(result));
      } else {
        res.writeHead(404);
        res.end();
      }
    })
    
    server.listen(Number(process.argv[2]));

实际问题

我看着这个sn-p,愣住了。

if (/^\/api\/parsetime/.test(req.url))
        result = parsetime(time);
else if (/^\/api\/unixtime/.test(req.url))
        result = unixtime(time);

谁能解释一下/^\/api\/parsetime/.test(req.url) 究竟做了什么?起初它看起来像是某种正则表达式,但我从未见过 RegExp 可以调用方法。我猜它是某种形式的 URL 路径识别,但猜测在行业中没有多大价值。

提前感谢大家!

【问题讨论】:

标签: javascript json node.js api http


【解决方案1】:

在:

if (/^\/api\/parsetime/.test(req.url))
    result = parsetime(time);
else if (/^\/api\/unixtime/.test(req.url))
    result = unixtime(time)

if 语句中的第一个“/”字符表示 JavaScript 中正则表达式对象的开始,并以另一个“/”字符结束。因此,例如 /a/.test('a') 将评估为 true

正则表达式中的“^”字符仅表示正则表达式中的第一个字符,而“\/”是因为“/”是结束正则表达式的特殊字符,而“@987654330”前面的@" 是另一个取消特殊字符的特殊字符,因此使用 "\/" 我们最终会得到一个文字 "/" 作为我们搜索模式中的第一个("^") 字符。

所以在/^\/api\/parsetime/ 上面的正则表达式中,我们通过取消“/”字符来保持模式。前面的“^”表示我们需要以文字“/”开头。然后我们像往常一样使用“/”终止正则表达式。

在这里找到的正则表达式和其他特殊字符: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions

【讨论】:

    【解决方案2】:
    var http = require('http')
    var url = require('url')
    
    function parsetime (time) {
      return {
        hour: time.getHours(),
        minute: time.getMinutes(),
        second: time.getSeconds()
      }
    }
    
    function unixtime (time) {
      return { unixtime: time.getTime() }
    }
    
    var server = http.createServer(function (req, res) {
      var parsedUrl = url.parse(req.url, true)
      var time = new Date(parsedUrl.query.iso)
      var result
    
      if (/^\/api\/parsetime/.test(req.url)) {
        result = parsetime(time)
      } else if (/^\/api\/unixtime/.test(req.url)) {
        result = unixtime(time)
      }
    
      if (result) {
        res.writeHead(200, { 'Content-Type': 'application/json' })
        res.end(JSON.stringify(result))
      } else {
        res.writeHead(404)
        res.end()
      }
    })
    server.listen(Number(process.argv[2]))
    

    【讨论】:

      【解决方案3】:

      说明书说:

      编写一个 HTTP 服务器,在接收到路径“/api/parsetime”的 GET 请求时提供 JSON 数据(...)将第二个端点添加到路径“/api/unixtime”

      这意味着服务器获取的 GET 请求可以是“/api/parsetime”以外的路径(分别是“/api/unixtime”)

      因此,您想测试服务器获取的 GET 请求是否是提到的 2 个路径中的任何一个。你用一个正则表达式来做到这一点。根据给定的 2 URL 检查 URL 的一种简单方法是使用 test() 方法。

      查看 MDN 上的正则表达式示例:

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test

      【讨论】:

        【解决方案4】:

        看起来好像

        if (/^\/api\/parsetime/.test(req.url))
            result = parsetime(time);
        else if (/^\/api\/unixtime/.test(req.url))
            result = unixtime(time);
        

        正在调用一个函数,但它只是生成一个字符串输出,实际调用者调用 .test() 将其转换为一个真实的表达式。

        有关 javascript 正则表达式的更多信息,请查看https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions

        【讨论】:

          猜你喜欢
          • 2016-09-19
          • 1970-01-01
          • 2022-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          相关资源
          最近更新 更多