【问题标题】:How does http.createServer() know the parameters of the callback?http.createServer() 如何知道回调的参数?
【发布时间】:2021-01-02 03:48:34
【问题描述】:

here is the picture

http.createServer((req,res)=>{});

createServer 函数如何自动知道回调函数对传入消息对象具有“req”,而对服务器响应对象具有“res”

谁能告诉我一个如何创建像createServer这样的函数的例子

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    http.createServer() 不知道你为回调参数声明了什么。无论您如何声明回调,http.createServer() 在您调用回调时都会将两个参数传递给它。第一个是http请求对象,第二个是http响应对象。如果您的回调想要正常工作并使用这些参数,它必须创建两个匹配的参数。您可以随意命名它们。该名称仅对您的回调是本地的。

    因此,您可以执行以下任何操作:

    http.createServer((request, response) => {
        response.end("hi");
    });
    
    http.createServer((req, res, goop) => {
        // goop will be undefined here since no third argument is passed to the callback
        res.end("hi");
    });
    
    http.createServer((a, b) => {
        b.end("hi");
    });
    
    http.createServer((...args) => {
        args[1].end("hi");
    });
    
    http.createServer(function() {
        arguments[1].end("hi");
    });
    

    谁能告诉我一个如何创建像 createServer 这样的函数的例子

    您可以创建一个接受回调函数的函数,然后使用一组参数调用该回调:

    function readJSON(filename, callback) {
        fs.readFile(filename, function(err, data) {
            if (err) {
                callback(err);
            } else {
                try {
                    let json = JSON.parse(data);
                    callback(null, json);
                } catch(e) {
                    callback(e);
                }
            }
        });
    }              
                
    

    在这里,您创建一个接受文件名和回调的函数。然后它读取该文件,解析其中的 JSON,并使用 null 调用回调以获取错误,并使用解析的 Javascript 对象获取第二个参数。如果有错误,那么它只是将错误作为第一个参数传递。

    【讨论】:

    • 谢谢你太棒了,你能看一下我刚刚添加到问题正文中的图片吗
    • 如何创建一个函数,在调用时将两个参数传递给回调
    • @Moe - 我的答案已经包含一个您可以创建的函数示例,该函数接受回调作为参数,然后根据条件使用一个或两个参数调用该回调。我不知道您还想从这个答案中得到什么,如果您认为您选择了另一个答案真是太棒了,我会感到惊讶。我没听懂你在问什么吗?
    • @Moe - 您的屏幕截图似乎来自编辑器。编辑器将从文档中获取输入信息,或者从使用情况或从 TypeScript 绑定中推断出来。 Javascript 本身不是一种类型化语言,因此未使用特定参数声明回调参数。对于语言来说,它只是一个回调函数。它的调用方式取决于调用者,而该函数调用的接收者只需要知道调用它时的参数是什么。如果你想要一个类型化的 Javascript 版本,你可以使用 TypeScript 来声明这些东西。
    【解决方案2】:

    HTTP 是一个包含 1 个名为 createServer 的函数的类,您可以在 https://nodejs.org/api/http.html 找到有关 HTTP 对象的一些详细信息,当发生请求之类的事情时,服务器会返回带有一些参数的回调函数。

    希望通过 1 个示例更容易理解:

    你有以下课程:

    class User {
      userInfo = {
        name: "Jhon",
        surname: "Doe"
      }
      getFullName = (callback) => {
        return callback(this.userInfo.name, this.userInfo.surname)
      }
    }
    

    这个类有 2 个定义的属性,包含“用户”的姓名和姓氏的 userInfo,以及 1 个函数 getFullName,该函数需要另一个函数作为输入,每当我们调用它时,我们都会收到 2 个参数输出:

    const UserInfo = new User()
    UserInfo.getFullName((name,surname) => console.log(`Hello ${name} ${surname}`))
    

    希望这能回答您的问题,如果您还有其他问题或我完全误解了您的问题,请随时告诉我!

    【讨论】:

    • 非常感谢,但你能看一下我刚刚添加到我的问题中的图片吗
    • “createServer”回调之所以知道第一个参数是请求对象,而第二个参数是响应对象,是因为在节点 HTTP 类的某处(您可以在这里找到它github.com/nodejs/node/blob/… ) 有一些复杂的逻辑在最后运行你的回调,就像在我的例子中一样,按特定顺序将多个参数传递给你的 cb 函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2010-11-05
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多