【问题标题】:Double parameters with require: var io = require('socket.io')(http);带要求的双参数: var io = require('socket.io')(http);
【发布时间】:2014-07-21 09:08:45
【问题描述】:
我是 node 和 JS 的新手,正在研究 socket.io 聊天示例 (http://socket.io/get-started/chat/)。我在服务器中遇到了这段代码:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
我看过其他教程,但从未见过 require 之后的双括号。 (http)part 有什么作用?是require的参数,是不是改变了类型,还是别的什么?
谢谢!
【问题讨论】:
标签:
javascript
node.js
socket.io
requirejs
【解决方案1】:
在 JavaScript 中,函数是 First-class citizen。这意味着它可以被另一个函数返回。
考虑以下简单示例来理解这一点:
var sum = function(a) {
return function(b) {
return a + b;
}
}
sum(3)(2); //5
//...or...
var func = sum(3);
func(2); //5
在您的示例中,require('socket.io') 返回另一个函数,该函数会立即以http 对象作为参数调用。
【解决方案2】:
如果您有一个库 http 并且它有一个导出的模块 server,则进行扩展。
假设我们把这条线分开了:
var http = require('http').Server(app);
分成两行:
-
var http = require('http')
将“http”模块库作为 JSON 对象导入 http 变量。这个模块库有一堆模块,您现在可以通过 http var 调用它们来访问它们。
-
httpServer = http.Server(app)
这将使用您在上面调用的 express 数据加载服务器模块(类似于构造函数)并将其放入 httpServer var。
上面的不同之处在于,它们不是两个步骤,而是将其浓缩为一个,因此http内部有Server模块,而不是整个http库。如果您只想使用 http 库的特定部分,这会很有用。
【解决方案3】:
Nodejs 允许您使用语句module.exports = something 将对象/函数分配给导出的模块。因此,这些语句中的每一个都在导入一个库,然后运行分配给导出内容的函数。
例如,here 是 express 的源代码,它们导出 createApplication 函数。
还有here's 一篇文章,他们会更详细地介绍。