学习Node.js ......好奇的范围

时间:2015-04-20 23:50:08

标签: javascript node.js

我正在阅读一本名为" Node Beginner Book"的电子书。它基本上是一个巨大的~50页的练习,涵盖了一堆基础知识。我最近在python中工作过,并且从前世开始使用php。所以我觉得这本书就在我的小巷里,当时这本书说的是它适合人们,至少有一种面向对象的语言,比如Ruby,Python,PHP或Java,只有很少 使用JavaScript体验,对Node.js来说是全新的。"

以下是上下文:


index.js

var server =  require("./server");
var router =  require("./router");
var requestHandlers = require("./requestHandlers");
var handle = {}
handle ["/"] = requestHandlers.start;
handle ["/start"] = requestHandlers.start;
handle ["/upload"] = requestHandlers.upload;

server.start(router.route, handle);

server.js

var http = require("http");
var url = require("url");

function start(route, handle) {
    function onRequest(request, response) {
        var pathname = url.parse(request.url).pathname;
        console.log("> Rcvd: " + pathname);

        route(handle, pathname, response);
    }

    http.createServer(onRequest).listen(8888);
    console.log("Server has started");
}

exports.start = start;

router.js

function route(handle, pathname, response) {
    console.log("Routing: " + pathname);
    if (typeof handle[pathname] === 'function'){
        return handle[pathname](response);
    } else {
        console.log("ReqH ERR: No handler for " + pathname);
        response.writeHead(404, {"Content-Type": "text/plain"});
        response.write("404 Not Found");
        response.end();
    }
}

exports.route = route;

requestHandlers.js

var exec = require("child_process").exec;

function start(response) {
    console.log("Request handler 'start' was called.");
    var content = "empty";

    exec("ls -lah", function (error, stdout, stderr) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.write(stdout);
        response.end();
    });

    return content;
}

function upload(response){
    console.log("ReqH: upload");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("From upload()");
    response.end();
}

exports.start = start;
exports.upload = upload;

然后通过node index.js启动应用。

好吧,我发现"执行顺序"或应用程序所采用的路径,首先包括server.jsrouter.js,所以我理解基本上应用& #39;生活'在index.js中,运行差事并在其他模块中工作。

这里的问题是...... server.js指的是函数route(),但并没有明确要求router.js这是定义{{1}的模块}}。

route()是否为其包含的模块设置范围?由于index.js中包含router.routeindex是否可以访问server范围而无需明确知道index来自何处?

Javascript非常松散,以至于这些'懒惰'有点事情证明有点挑战我的头脑。

1 个答案:

答案 0 :(得分:3)

阅读有关CommonJS的信息会很好 - > http://requirejs.org/docs/commonjs.html

index.js

var server =  require("./server");
var router =  require("./router");

...
// here you are passing in the route method as the route param
server.start(router.route, handle);

所以它实际上正在做的是调用server.js中的start函数并将router.route作为参数'route'

server.js

   var http = require("http");
    var url = require("url");

    // here route is just the name of the param 
    function start(route, handle) {
        function onRequest(request, response) {
            var pathname = url.parse(request.url).pathname;
            console.log("> Rcvd: " + pathname);

            route(handle, pathname, response);
        }

        http.createServer(onRequest).listen(8888);
        console.log("Server has started");
    }

    exports.start = start;

这里你要导出start函数,这就是为什么你可以像index.js中的var server = require('./server').start(router.route, handle)一样访问它。