title: 2nd Day
date: 2017-07-12 19:02:58

tags: [daily]

异步和同步

  • 同步:按顺序执行,单程
  • 异步:有回调函数,cb;所以会比其他函数处理慢,同时进行,多程

render.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function makeATag(link,fileSize){
return `<a href="${link}">${link} fileSize:${fileSize}</a>`
}
module.exports = function(list,fileSize){
var i = 0;
var html = '<h1>It Is A Diretory, File List Is: </h1>';
html += '<ul>'
html += `<li> ${makeATag('../')} </li>`;
for (i = 0; i < list.length; i++){
html += `<li> ${makeATag(list[i],fileSize[i])} </li>`;
}
html += '</ul>'
return html;
}
  • $对应传入的参数,在a标签中用传入的参数值
  • 将路径拼接,形成跳转
  • 此处设置跳转,使文件列举后可以点击进入查看里面的内容;module.exports使该函数暴露,可以在fileServer中加载该js

config.js

1
2
3
4
5
module.exports = {
VERSION: '0.0.1',
us: "Power-by-nightwatch",
root: "C:"
}
  • 此处可以设置的是启动管理器管理的根目录

table.js

1
2
3
4
5
6
7
8
9
10
11
var MIMEs = {
jpg: 'image/jpeg',
bmp: 'image/bmp',
css: 'text/css',
js: 'application/x-javascript',
html: 'text/html'
}
module.exports = function(type){
return MIMEs[type];
}
  • 设置MIME.暴露函数传入类型匹对文件是什么类型并返回

read.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
var fs = require('fs');
var path = require('path');
function toRead(fileAt, cb){
var fileType;
var wherePoint = fileAt.lastIndexOf('.');
if (wherePoint === -1){
fileType = null;
} else {
fileType = fileAt.substring(wherePoint + 1);
}
fs.readFile(fileAt, function(err, data){
if (err){
cb(err, {
type: fileType,
data: null
})
} else {
cb(null, {
type: fileType,
data: data
})
}
});
}
function toReadDir(dir, cb){
fs.readdir(dir, function(err, list){
if (err) cb(false);
else cb(list);
})
}
module.exports = {
toRead: toRead,
toReadDir: toReadDir
};
  • 需要先加载fs模板和path路径
  • modeule.exports暴露的是两个已经写好的函数,调用的时候在加载该js后+ .toRead
  • 注意!两个异步函数时传入的参数

执行文件(精髓):fileServer.js

1
2
3
4
5
6
7
8
9
10
var http = require('http');
var url = require('url');
var path = require('path');
var fs = require('fs');
var toRead = require('./read').toRead;
var toReadDir = require('./read').toReadDir;
var getType = require('./table');
var config = require('./config');
var listRender = require('./render');
  • 首先是加载模块和之前暴露的JS,使下面的函数能够使用
1
2
3
4
5
6
7
8
function res404(fileAt){
return function(res){
res.writeHead(404, {
"Content-Type": "text/html"
})
res.end(`404! <h1>${fileAt}</h1> Not Found!`);
}
}
  • 封装404,需要传入两个参数,第一次传回的时一个函数;在抛出异常的时候直接调用不需要再写,减少代码量,同理在字符串中使用变量的值需要用$来匹配传入的参数
  • writeHead的内容不显示在网页上,end的内容会显示

精髓中的精髓

1
2
3
4
5
6
7
8
9
10
var server = http.createServer(function(req, res){
var reqUrl = req.url;
var filePath = url.parse(reqUrl);
var fileAt = path.join(
config.root,
decodeURIComponent(
filePath.pathname //解码,拼接路径
)
);
  • 使用path.join将两个不用的路径拼接起来,newPath = path.join(url1, url2);
1
2
3
4
5
fs.stat(fileAt, function(statErr, theStat){
if (statErr) {
res404(fileAt)(res);
return;
}
  • 使用上面封装好的404抛出异常,传入两个参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
if (theStat.isDirectory()){
toReadDir(fileAt, function(list){
if (list){
res.writeHead(200, {
"Content-Type": getType('html'),
"FILE-SERVER-VERSION": config.VERSION,
"POWER": config.us
})
// render list see in render.js
var fileSize = [];
for(var j = 0 ; j< list.length; j++){
fileSize [j] = fs.statSync(path.join(fileAt, list[j])).size;
}
res.end(
listRender(list.map(function(fileName){
return path.join(
decodeURIComponent(
filePath.pathname
),
fileName
);
}),fileSize)
);
} else {
// 404
res404(fileAt)(res);
}
})
}
  • 判断如果该文件是个文件夹后的处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
else {
toRead(fileAt, function(err, file){
if (err){
res404(fileAt)(res);
} else {
var type = file.type
, data = file.data;
res.writeHead(200, {
"Content-Type": getType(type),
"FILE-SERVER-VERSION": config.VERSION,
"POWER": config.us
})
res.end(data);
}
})
}
});
});
  • 判断是文件可以直接开打查看内容