学习Node.js …好奇的范围

我正在阅读一本名为“The Node Beginner Book”的电子书。 这基本上是一个大的〜50页的练习,涵盖了一些基础知识。 我最近在python工作,并从过去的生活中的PHP。 所以我认为这本书是在说这本书的目的是为那些“至less有一个像Ruby,Python,PHP或者Java这样的面向对象的语言经验丰富的人,JavaScript只有很less的经验,而对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启动应用程序。

好吧,我看到“执行顺序”,或应用程序的path,首先包括server.jsrouter.js ,所以我明白,基本上应用程序“生活”在index.js,运行差事,并将在其他模块中工作。

这里的问题是…… server.js引用了函数route() ,但是并没有明确要求router.js ,它是定义route()的模块。

index.js是否为其包含的模块设置了范围? 由于router.route包含在indexserver可以访问index范围而不必明确知道route()来自哪里?

Javascript是如此的宽松,以至于这些“懒惰”的事情在我的脑海中被certificate是有点具有挑战性的。

阅读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; 

在这里你正在导出启动函数,这就是为什么你可以像这样访问它var server = require('./server').start(router.route, handle) in index.js