【问题标题】: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);
    

    分成两行:

    1. var http = require('http')

      将“http”模块库作为 JSON 对象导入 http 变量。这个模块库有一堆模块,您现在可以通过 http var 调用它们来访问它们。

    2. httpServer = http.Server(app)

      这将使用您在上面调用的 express 数据加载服务器模块(类似于构造函数)并将其放入 httpServer var。

    上面的不同之处在于,它们不是两个步骤,而是将其浓缩为一个,因此http内部有Server模块,而不是整个http库。如果您只想使用 http 库的特定部分,这会很有用。

    【讨论】:

      【解决方案3】:

      Nodejs 允许您使用语句module.exports = something 将对象/函数分配给导出的模块。因此,这些语句中的每一个都在导入一个库,然后运行分配给导出内容的函数。

      例如,here 是 express 的源代码,它们导出 createApplication 函数。

      还有here's 一篇文章,他们会更详细地介绍。

      【讨论】:

        猜你喜欢
        • 2014-08-31
        • 2019-02-08
        • 2021-05-08
        • 2015-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多