今天开始学习Nodejs官网提供api(一般称这为模块)练习,类似java JDK, 根据第一天代码:
//导入 http模块
var http = require('http');
//创建一个httpServer 并监听8081端口
http.createServer(function (req, res) {
//响应客户端请求,并输出信息 --> Hello, World.
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello, World.');
res.end(); //结束本次请求
}).listen(8081);
以上是一个很简单的web程序,提供了从服务器端到应用端的全部流程,这里的业务逻辑非常简单,只是向页面输出字符串 Hello, World.
.
接下来,根据我学习后的理解全手动编写了如下代码(#-_-),稍微能处理来自不同的请求,类似java # DispatcherServlet
:
首先,先定义程序的入口,虽然js没有main
函数, 新建一个index.js
, 先不计划编码任何代码。
然后,新建server.js
,用来存放第一天学习的部分内容,就像文件名一样,是一个类似server
的功能,代码如下:
//导入http 和 url模块 类似java的 Map\\\\List等工具类
var http = require('http'),
url = require('url') ;
function start() {
//请求处理函数,就是第一天学习的箭头函数,这里不再是一个匿名函数
function onRequest(req,res) {
//这里通过url模块提供函数 parse获得请求方法,详细可以参考node官方网站document说明
var pathName = url.parse(req.url).pathname ;
console.log('request path ',pathName) ;
//响应状态码 和格式
res.writeHead(200,{'Content-Type':'text/plain'}) ;
res.write('Hello,World.') ;
res.end() ;
}
http.createServer(onRequest).listen(8081) ;
console.log('server has started.') ;
}
//将函数start函数导出为一个模块
//export
exports.start = start ;
然后回到index.js
中 编写如下代码:
//导入刚才我们编写的server模块
var server = require('./server') ;
//调用模块提供server功能
server.start() ;
然后可以运行如下命令:
node index.js
访问http://localhost:8081
,可以看到输出。
上面代码将业务逻辑放到了 server
中,在实际工作中,这明显是非常不合理的,因为业务逻辑变更比女人翻脸还快,放到server
中后果可想而知。这里需要调整,记得在刚开始学习java #servlet
的时候,我们最开始是使用get
方式将方法传递到服务器端,然后通过永远也写不完的if....else if.... else if....
来进行不同功能的分发,这里如果提供一个类似路由表的东西就可以达到类似的目的,由于javaScript
对象是key-value
的形式出现,这给这一功能提供了方便,例如:
var handle = {} ;
handle['/'] = root ; //代表访问项目首页
handle['/start'] = start ; //代表访问项目首页
handle['/upload'] = upload ; //代表上传文件请求
这样,不同的功能类似一张路由表被关联起来了,例如:
//dispatcher.js
function start() {
console.log('call /start') ;
return 'call /start' ;
}
function upload() {
console.log('call /upload') ;
return 'call /upload' ;
}
function root() {
console.log('call /') ;
return 'call /' ;
}
exports.start = start ;
exports.upload = upload ;
exports.root = root ;
以上代码表示不同需求的功能函数。然后再提供一个路由转发功能的模块,例如:
//router.js
function route(path,handle) {
console.log('route path ',path) ;
var fun = handle[path] ;
if(typeof fun === "function") {
return fun.call(null,arguments) ;
}else {
console.log('unknown path.') ;
return 'unknown path.' ;
}
}
exports.route = route ;
然后我们需要对index.js
和server.js
中的代码进行适当的修改,如下:
server.js
//server.js
//导入http 和 url模块 类似java的 Map\\\\List等工具类
var http = require('http'),
url = require('url') ;
//服务启动需要传递两个参数,handle为转发提供映射表,route执行转发
function start(handle,route) {
//请求处理函数,就是第一天学习的箭头函数,这里不再是一个匿名函数
function onRequest(req,res) {
//这里通过url模块提供函数 parse获得请求路径,详细可以参考node官方网站document说明
var pathName = url.parse(req.url).pathname ;
console.log('request path ',pathName) ;
//响应状态码 和格式
res.writeHead(200,{'Content-Type':'text/plain'}) ;
//使用route 模块进行转发请求,这里为了能看到明显的效果,将不同功能信息输出到页面
//dispatcher
var content = route(pathName,handle) ;
console.log('return content',content) ;
res.write(content) ;
//res.write('Hello,World.') ;
res.end() ;
}
http.createServer(onRequest).listen(8081) ;
console.log('server has started.') ;
}
//将函数start函数导出为一个模块
//export
exports.start = start ;
index.js
//index.js
var server = require('./server'),
router = require('./router'),
dispatcher = require('./dispatcher');
var handle = {} ;
handle['/'] = dispatcher.root ;
handle['/start'] = dispatcher.start ;
handle['/upload'] = dispatcher.upload ;
server.start(handle,router.route) ;
运行 node index.js
,并访问映射路径可以看到不同的输出信息, 例如: http://localhost:8081/upload
// call /upload
至此,第二天nodejs的学习到这里就结束啦,#-_- 晚安! 以上内容如有发现错误一定请各位朋友指出,非常感谢!
网友评论