在javascript中捕获返回的函数

时间:2016-12-26 17:14:35

标签: javascript node.js

我有以下代码如下:

function(staticPath) {
    console.log('static Path = ' +staticPath);
    return function(data, response) {

        console.log('data = ' +data);
        console.log('response = ' +response);
        var readStream;
        // Fix so routes to /home and /home.html both work.
        data = data.replace(/^(\/home)(.html)?$/i, '$1.html');
        data = '.' + staticPath + data;
        fs.stat(data, function(error, stats) {
            if (error || stats.isDirectory()) {
                return exports.send404(response);
            }
            readStream = fs.createReadStream(data);
            return readStream.pipe(response);
        });
    }
}

此函数基本上解析HTML文件的路径并显示文件的内容。

我无法理解如何从外部调用此方法。

我称之为:

staticFile("D:\\Node Applications\\public\\home.html")

我可以在变量innerFunc中捕获它,我可以将内部函数称为innerFunc(response),其中响应 http的serverResponse 其中我有我的参考,但我不知道我怎么能通过data param。

我不了解幕后发生的事情。谁能解释一下?我们经常在javascript中遇到这样的代码吗?

修改: 为了清楚起见: 还有另一种方法如下:

function(data, response) {
    response.writeHead(200, {
        'Content-Type': 'application/json'
    });
    response.end(JSON.stringify(data));
}

我从我的节点服务器逻辑调用如下:

http.createServer(function(req, res) {
    // A parsed url to work with in case there are parameters
    var _url;
    // In case the client uses lower case for methods.
    req.method = req.method.toUpperCase();
    console.log(req.method + ' ' + req.url);

    if (req.method !== 'GET') {
        res.writeHead(501, {
            'Content-Type': 'text/plain'
        });
        return res.end(req.method + ' is not implemented by this server.');
    }
    if (_url is something like //localhost:1337/employees) {
            //call employee service which returns *data*.
            // send the data with a 200 status code
            return responder.sendJson(data, res);
        });
    } else {
        // try to send the static file
        /*res.writeHead(200);
        res.end('static file maybe');*/
        console.log('Inside else');
        var staticInner = responder.staticFile("D:\\Node Applications\\public\\home.html");
        staticInner(res);
    }

    // res.end('The current time is ' + Date.now())
}).listen(1337, '127.0.0.1');

正如可以看到没有 data 变量传递给 innerFunc 因此,感到困惑。

2 个答案:

答案 0 :(得分:1)

根据" innerFunc",似乎data是一些字符串,与staticPath连接,形成文件的路径。我们可以看到,该路径已使用fs.stat进行测试。也许客户端应该发送一些自定义数据?无论如何,data对于像这样的变量来说似乎是一个非常糟糕的名字。

似乎该功能试图将文件作为响应发送? staticPath应该是一个相对于此代码所在的Javascript文件的路径,因为它是这样连接的:

data = '.' + staticPath + data;

这将以./some/path/index.html之类的结尾。 staticPath的值为/some/pathdata的值为index.html。因此,如果您的JS文件位于/home/foo/node/index.js,那么" innerFunc"将尝试查找将在/home/foo/node/some/path/index.html

如果您将[{1}}传递给"D:\\Node Applications\\public\\home.html",那么您会得到类似staticFile()的内容,这显然是无效的文件。

回答函数返回函数的重点

在这种情况下,正如mgouault所说,完全没有意义。也许程序员有一些想法,但在编程时改变了它,函数最终就像那样(有时会发生)。

答案 1 :(得分:0)

您的函数(例如:function(staticPath))应该具有名称或存储在变量中以便能够调用它们。所以我猜你将所有这些代码都存储在变量staticFile中。

然后当您使用参数staticFile("D:\\Node Applications\\public\\home.html")调用它时,它会返回一个函数(return function(data, response) {...})。

现在您已拥有此内部功能,可以使用dataresponse调用它:

var innerFunc = staticFile("D:\\Node Applications\\public\\home.html");
innerFunc(data, response);

哪个会使用您的变量response(我猜)。

返回函数的函数在javascript中经常出现,特别是在为某些目的使用闭包时,但在这种情况下它并没有真正有用。