【问题标题】:basic javascript object and mime regarding a basic web-server code关于基本 Web 服务器代码的基本 javascript 对象和 mime
【发布时间】:2013-07-28 15:32:05
【问题描述】:

我是使用 javascript 编程的新手。我为服务器端选择了 angular + node.js。 我浏览了角度教程,我对他们给出的 web-server.js 有一些疑问。由于服务器部分未包含在 Angular 教程中,我有一些问题:

服务器使用以下命令行运行:

node ./scripts/web-server.js

正在执行的主要功能是“主要”,它通过以下方式完成: main(process.argv);

功能是:

function main(argv) {
  new HttpServer({
    'GET': createServlet(StaticServlet),
    'HEAD': createServlet(StaticServlet)
  }).start(Number(argv[2]) || DEFAULT_PORT);
}

function HttpServer(handlers) {
  this.handlers = handlers;
  this.server = http.createServer(this.handleRequest_.bind(this));
}

function createServlet(Class) {
  var servlet = new Class();
  return servlet.handleRequest.bind(servlet);
}

function StaticServlet() {}

StaticServlet.MimeMap = {
  'txt': 'text/plain',
  'html': 'text/html',
  'css': 'text/css',
  'xml': 'application/xml',
  'json': 'application/json',
  'js': 'application/javascript',
  'jpg': 'image/jpeg',
  'jpeg': 'image/jpeg',
  'gif': 'image/gif',
  'png': 'image/png',
  'svg': 'image/svg+xml'
};

我的问题:

{    'GET': createServlet(StaticServlet),
    'HEAD': createServlet(StaticServlet)
  }

我不明白这些行是做什么的。我假设这条线创建了一个对象,但我知道的方式更像

{
    GET: createServlet(StaticServlet),
    HEAD: createServlet(StaticServlet)
  }

这些行中的“”是什么意思?

第二个问题: 这些是什么意思?

.start(Number(argv[2]) || DEFAULT_PORT);

.start 函数是:

HttpServer.prototype.start = function(port) {
  this.port = port;
  this.server.listen(port);
  util.puts('Http Server running at http://localhost:' + port + '/');
};

但我不明白为什么 ||并且 argv[2] 实际上是 null 那么我们为什么需要传递它。

第三个问题: 是关于 StaticServlet.MimeMap 的创建。 这与我认为的第一个问题非常相似。我不明白这里的语法:

'txt': 'text/plain',.

它创造了什么?

【问题讨论】:

  • ''(单引号或双引号)仅表示字符串;很可能在 GETHEAD 文本周围它们是不必要的,如果 Node.js 将它们作为 Javascript 对象表示法读取到初始化程序,而不是 JSON(这似乎合乎逻辑,但我不是 Node.js 开发人员,每瑟)。无论哪种方式,它都会起作用,我想。 condition || condition 只允许您说this OR that,如果前者是falsey。这允许“默认”设置(将其视为简单 if 的简写),在这里它直接传递给函数,而不是首先存储在变量中。
  • 老实说,在开始学习框架之前,您应该学习纯 JavaScript。如果你这样做了,这些是你现在应该学会的一些怪癖和符号。
  • 注意不要将 object notation 与 JSON 混淆,后者是一个字符串,计算结果为 object notation。它需要引用键名(例如,'{"name":"value"}'),而普通对象表示法不需要(例如,{name:"value"})。这取决于它是作为 Javascript 运行还是 评估 作为 Javascript 运行(因此 JSON 是一个字符串,例如,eval('{"name":"value"}'))。
  • A link 解释差异。

标签: javascript node.js angularjs


【解决方案1】:

在上面 Jared 的 cmets 上进行扩展。

在 HttpServlet 构造函数和 MimeMap 初始化程序中使用单引号可能只是最初作者的风格偏好。

有时这是必要的。例如,当使用的名称根据语法规则无效或者是保留的 javascript 关键字时。

来自A Survey of the JavaScript Programming Language

在对象字面量表示法中,对象描述是一组 花括号内以逗号分隔的名称/值对。名字可以是 标识符或字符串后跟冒号。因为中的一个错误 语言定义,标识符中不能使用保留字 形式,但可以以字符串形式使用。

例如:

{ 
    'my name here': 'bob',
    '0':            '',
    'new':          ''
}

行:

.start(Number(argv[2]) || DEFAULT_PORT);

基本上只允许您在命令行中传递一个端口,以便调用者可以明确请求服务器在该端口上侦听,而无需修改源。例如:

node ./scripts/web-server.js 8080

可以表示为:

.start( Number(argv[2]) ? Number(argv[2]) : DEFAULT_PORT );

或更冗长:

var server = new HttpServer({…});
if(Number(argv[2]) {
    server.start(Number(argv[2]);
} else {
    server.start(DEFAULT_PORT);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2010-11-03
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多