原生搭建一个服务,最核心的就是http模块,这个模块也是NodeJS的核心模块,如今都提倡模块化,在这我进行模块化的制作的学习。
index.js 模块
这个模块是一个文件入口模块主要处理引入与路由表
var server = require('./server.js');// 服务模块
var router = require('./router.js');// 路由模块
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){
http.createServer(function(request, response){
// url.parse(url) 处理URL
var pathname = url.parse(request.url).pathname;
if(pathname === '/favicon.ico'){
}else{
// 调用路由模块方法
var content = route(handle, pathname);
response.writeHeader(200, {'Content-Type': 'text/plain;charset=utf-8'});
response.write(content);
response.end();
}
}).listen(8080, function(){
console.log('端口号为8080');
})
}
exports.start = start;
写入中文乱码:首先查看自己js是否是utf-8,用记事本重新保存,再不行就在写入头的时候下加入charset=tuf-8;response.writeHeader(200, {'Content-Type': 'text/plain;charset=utf-8'});
router.js 模块
这个模块专门处理用户浏览的路由,并让路由响应
function route(handle, pathname){
// 处理路由
if (typeof handle[pathname] === "function") {
return handle[pathname]();
}else{
return "404 not found";
}
}
exports.route = route;
requestHandler.js 模块
这个模块专门处理路由的响应
/**
* 路由处理,有几个路由就写几个方法
*/
function start(){
return "start";
}
function upload(){
return "upload";
}
exports.start = start;
exports.upload = upload;
使用以上路由开始制作图片上传与显示
修改内容:
index.js
之前:存在路由表
之后:移除路由表,各司其职。
requestHandler.js
之前:是路由处理与接口的暴露。
之后:把入口文件里的路由表转移到这里,暴露路由的接口。把对应处理路由的方法分成更小更细的模块,这样更方便管理与维护。
server.js
结构上没有太大的改变都是处理路由与开启服务器
router.js
结构上没有太大改变,处理路由让路由响应
代码使用了formidable.js这是一个处理上传文件的js,其中的坑有
- 路径不存在的时候需要自己创建
- formidable上传图片使用rename报错,错误代码:return binding.rename(pathModule._makeLong(oldPath)
解决方法:创建一个公共的文件夹进行存储
form.uploadDir = "public/upload";
具体代码:
代码查看