Javascript 学习节点。js。。。好奇的范围
我正在读一本叫做“节点入门书”的电子书。这基本上是一个50页的大练习,涵盖了一系列基础知识。我最近一直在python中工作,并且从过去的生活中学习php。因此,当这本书说它是为“至少有一种面向对象语言(如Ruby、Python、PHP或Java)经验的人设计的,而这些语言只有很少的经验”时,我觉得这是我的拿手好戏 体验JavaScript,对Node.js来说是全新的。” 以下是上下文:Javascript 学习节点。js。。。好奇的范围,javascript,node.js,Javascript,Node.js,我正在读一本叫做“节点入门书”的电子书。这基本上是一个50页的大练习,涵盖了一系列基础知识。我最近一直在python中工作,并且从过去的生活中学习php。因此,当这本书说它是为“至少有一种面向对象语言(如Ruby、Python、PHP或Java)经验的人设计的,而这些语言只有很少的经验”时,我觉得这是我的拿手好戏 体验JavaScript,对Node.js来说是全新的。” 以下是上下文: index.js var server = require("./server"); var route
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;
路由器.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.js
和router.js
开始,所以我知道应用程序基本上“生活”在index.js中,跑腿并在其他模块中工作
问题是server.js
引用函数route()
,但不明确要求定义route()
的模块router.js
index.js
是否为它包含的模块设置范围?既然router.route
包含在index
中,那么server
是否可以访问index
es范围,而不必明确知道route()
的来源
Javascript是如此的松散,以至于这些“懒惰”的东西对我来说是一种挑战。阅读CommonJS-> index.js 所以它实际上是在server.js和passign router.route中调用start函数作为参数'route' server.js
在这里导出start函数,这就是为什么可以像这样访问它。
var server=require('./server').start(router.route,handle)
在index.js中将函数传递给server.start(router.route,handle);事实上,既然你指出了这一点,作者实际上解释了这一点。当我在看下面的代码时,我想我忘了他是这么说的。归根结底,start()并不是指任何东西,它只是处理给定的内容。谢谢。因为var server=require('./server')
和exports.start=start
是通用的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);
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;