感谢@阿FA的点评。事实上,所有的需求只需要一个http-server模块。https://www.npmjs.com/package/http-server如果你想自己实现一个,你可以阅读下面的文章。一开始因为最近在学习vue.js,需要渲染网页。不过感觉搭建php环境有点复杂,于是用nodejs学习了一个server.js,方便自己本地页面调试。所需功能如下支持访问html页面支持默认index.html,index.htm文件访问支持路由+全路径访问关于文章2,访问http://localhost.com:8080/vue/指向vue/index.html文件项目地址https://github.com/sunshinev/sunhuajie_node_server目录结构sunhuajie:nodesun.huajie$tree.├──index.js//启动服务的文件├──lyric.txt//读写测试文件文本├──node_modules│└──huajie_server//自定义模块│├──package.json//模块配置│├──requesthandler.js//请求处理脚本│├──router.js//路由脚本│└──server.js//服务创建脚本└──vue//工作目录└──index.html服务创建流程index.js启动是因为服务端被封装成一个模块,所以只每次启动都需要导入,然后nodeindex.js就可以了。#!/usr/bin/envnodevarserver=require('huajie_server');server.create();效果如图:sunhuajie:nodesun.huajie$nodeindex.js端口为8080server.jscreateservice_onRequest实现了请求处理后作为闭包传递给http.createServer。状态码由路由层返回。#!/usr/bin/envnodevarhttp=require('http');varrouter=require('./router');//创建服务器默认端口为8080functioncreate(port=8080){console.info('端口是'+端口);http.createServer(_onRequest).listen(port);}//处理请求函数_onRequest(request,response){//routevarres=router.route(request.url);//状态码response.writeHead(res.code,{});//响应内容response.write(res.content);response.end();}exports.create=create;router.jsrouting这里的路由跟php的mvc的dispatcher(分发器)很像,解析url参数和目录,实现文件指向。这里有一个小问题,就是在写这个router的时候,把requesthandler.js中关于文件判断的部分放到router里面其实是合理的。但是当时为了方便,直接写到requesthandler里面了(这个文件后面给大家看)。在路由层,其实可以加一个rewrite配置。先解析url,通过rewrite重新指向,将指向的地址传递给requesthandler处理。#!/usr/bin/envnodevarurl=require('url');varquerystring=require('querystring');varrequesthandler=require('./requesthandler');//Todo后面可以扩展路由部分的功能route(request_url){//解析地址varurl_parse=url.parse(request_url);varurl_path=url_parse['path'];变量res={};变种代码=200;//判断路径是否存在varcontent=requesthandler.句柄(url_path);return{'code':code,'content':content}}exports.route=route;requesthandler.js请求处理+指向这个文件的文件最简单的目的就是读取和输出html文件。但是我们加了一层默认文件,所以需要遍历目录,判断当前childnode是dir还是file。默认情况下,可以访问两个文件,index.html和index.htm。_findFile方法首先判断当前传递的file_path是否是一个存在的文件。如果不是文件,则在该目录层级搜索,看是否有默认可以访问的文件。遍历的时候没有使用forEach,因为会遍历所有的文件,不管中间有没有return。_isFile方法使用trycatch,因为fs.statSync在文件不存在时会抛出错误,导致脚本终止。#!/usr/bin/envnodevarfs=require('fs');//默认搜索文件可以修改为配置项vardefault_files=['index.htm','index.html'];functionhandle(url_path){//文件路径构造varfile_path='.'+网址路径;//判断路径是否存在varf_path=_findFile(file_path);if(!f_path){return'路径“'+file_path+'”不存在';}else{varcontent=fs.readFileSync(f_path);返回内容;}}/***查找目录中是否存在不同文件名,建立优先级*@return{[type]}[description]*/function_findFile(file_path){varis_file=_isFile(file_path);//如果文件存在,直接返回路径if(is_file){returnfile_path;}//如果文件不存在,构造路径查找文件varregex=/^\.\/[\w]*([\/][\w]+)?/;varregex_res=file_path.match(正则表达式);//匹配目录路径./vue/test/s=>./vue/testif(!regex_res){return'';}else{//这里不用forEach,因为会遍历所有的值for(vari=0;i
