搭建静态资源服务器之node HTTP
模块
-
1. 代码如下:
const http = require('http'); const ip = '192.168.1.108'; const port = 3608; http.createServer((req,res)=>{ res.writeHead(200,{'Content-Type':'text/html'}); res.write("<html>"); res.write("<head>"); res.write("</head>"); res.write("<body>"); res.write("<h1>hello nodejs world!</h1>"); res.write("</body>"); res.write("</html>"); res.end(); }).listen(port,ip,()=>{ console.log('server start'); });
- 先在linux输入命令
显示root@tecmint:~# node app.js
server start //表示已经启动服务
- 在浏览器中输入ip地址
192.168.1.108:3608 //显示相对应的信息
- 先在linux输入命令
- 封装成函数
- 代码如下:
const http = require('http'); const ip = '192.168.2.108'; const port = 3608; var fn = function(req,res){ res.writeHead(200,{'Content-Type': 'text/html'}); res.write("<html>"); res.write("<head>"); res.write("</head>"); res.write("<body>"); res.write("<h1>hello nodejs world!</h1>"); res.write("</body>"); res.write("</html>"); res.end(); } var fs = function(){ console.log('server start'); } http.createServer(fn).listen(port,ip,fs);
搭建静态资源服务器之node URL
模块
-
url.parse(urlStr[, parseQueryString][, slashesDenoteHost]);
- 说明: 将一个URL字符串转换成对象并返回
- 参数:
- urlStr 表示url字符串
- parseQueryString 为true时将使用查询模块分析查询字符串,默认为false
- slashesDenoteHost
默认为false,//foo/bar 形式的字符串将被解释成 { pathname: ‘//foo/bar' }
如果设置成true,//foo/bar 形式的字符串将被解释成 { host: ‘foo', pathname: ‘/bar' }
- 代码如下:
const http = require('http'); const url = require('url'); const ip = '192.168.2.108'; const port = 3608; var fn = function(req,res){ var pathname = url.parse(req.url).pathname; res.write(pathname); res.end(); } var fs = function(){ console.log('server start'); } http.createServer(fn).listen(port,ip,fs);
搭建静态资源服务器之node fs
模块
-
Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
建议大家是用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
-
fs.readFile(file[, options], callback);
- 说明:
- 异步读取文件。其中file可以为文件名或文件路径,options可以为对象或字符串。包括读取文件时的编码、文件的读取方式(默认为‘r’);
- fs.readFile(文件名,编码,回调函数(err,data));
- 代码如下:
var fs = require("fs"); // 异步读取 fs.readFile('input.txt', function (err, data) { if (err) { return console.error(err); } console.log("异步读取: " + data.toString()); }); // 同步读取 var data = fs.readFileSync('input.txt'); console.log("同步读取: " + data.toString()); console.log("程序执行完毕。");
- 说明:
nodejs文件操作模块FS(File System)常用函数简明总结
件系统操作相关的函数挺多的。首先可以分为两大类。
一类是异步+回调的。 一类是同步的。
在这里只对异步的进行整理,同步的只需要在函数名称后面加上Sync即可
-
1.1 首先是一类最常规的读写函数,函数名称和形式,应该是起源于C语言的。
-
fs.open(path, flags[, mode], callback);
- 说明:异步模式下打开文件
- fs.open(文件路径,读写标识,[文件mode值,666],回调函数(err,文件句柄fd));
- 参数:
- path - 文件的路径。
- flags - 文件打开的行为。具体值详见下文。
- mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。
- callback - 回调函数,带有两个参数如:callback(err, fd)。
- 实例:
以上代码执行结果如下:var fs = require("fs"); // 异步打开文件 console.log("准备打开文件!"); fs.open('input.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("文件打开成功!"); });
$ node file.js 准备打开文件! 文件打开成功!
-
fs.read(fd, buffer, offset, length, position, callback);
说明:异步模式下读取文件
fs.read(文件句柄fd,被写入的buffer,offset,length,position,回调函数(err, bytesRead, buffer));
-
参数 :
- fd - 通过 fs.open() 方法返回的文件描述符。
- buffer - 数据写入的缓冲区。
- offset - 缓冲区写入的写入偏移量。
- length - 要从文件中读取的字节数。
- position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
- callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。
其功能为从指定的文件描述符 fd 中读取数据并写入 buffer 指向的缓冲区对象。offset 是buffer 的写入偏移量。length 是要从文件中读取的字节数。position 是文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。回调函数传递bytesRead 和 buffer,分别表示读取的字节数和缓冲区对象。
- 实例:
```
var fs = require("fs");
var buf = new Buffer(1024);console.log("准备打开已存在的文件!");
fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
console.log("文件打开成功!");
console.log("准备读取文件:");
fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
if (err){
console.log(err);
}
console.log(bytes + " 字节被读取");// 仅输出读取的字节 if(bytes > 0){ console.log(buf.slice(0, bytes).toString()); } });
});
以上代码执行结果如下:
$ node file.js
准备打开已存在的文件!
文件打开成功!
准备读取文件:
42 字节被读取
百度:www.baidu.com
-
fs.write(文件句柄fd,被读取的buffer,offset,length,position,回调函数(err,bytesWritten,buffer));
功能为将buffer内容写入fd中。
+ fs.close(文件句柄,回调函数);
+ fs.truncate(文件句柄,截断长度,回调函数);
+ fs.fsync(文件句柄,回调函数); 未完待续;
-
构建一个静态资源的服务器,根据不同的url地址请求不同的文件(模板)
- 实例:
//加载http服务api模块 var http = require('http'); var ip = '192.168.1.108'; //加载fs文件服务api模块 var fs = require('fs'); //创建新的HTTP服务器 var server = new http.Server(); //创建url路由api模块 var urlpai = require('url'); //监听端口 server.listen(3068,ip); //使用on方法注册事件处理,该事件一直被监听。任何的请求都会进入回调函数,执行相应的操作 server.on("request",function(request,response){//当有request请求的时候触发处理函数 //解析请求url var url = urlpai.parse(request.url); //监听请求的网站,以当前脚本目录为根目录的url地址 //console.log(url.pathname); //特殊url会让服务器在发送响应前先等待 switch(url.pathname){ case '' || '/'://处理请求的网站根目录,指定加载对应的文件夹,一般以根目录的index.html为默认,node.js是高效流处理的方案,也可以通过配置文件来配置 fs.readFile("./index.html",function(err,data){//打开请求文件 if(err){ //输入错误信息,也可以自定义错误信息 response.writeHead(404,{'Content-Type':'text/plain;charset="UTF-8"'}); response.write(err.message); response.end(); }else{ //请求成功返回数据 response.writeHead(200,{'Content-Type':'text/html;charset="UTF-8"'}); //告诉响应头文件,返回数据的类型 response.write(data);//返回的内容,有时候还会加上buter数据类型 response.end();//结束相应,不写的话。会一直处于相应状态,页面不会显示内容 } }); break; case '/list': //显示商品列表页 fs.readFile("./list.html",function(err,data){ if(err){ response.writeHead(400.{'Content-Type':'text/plain;charset="UTF-8"'}); response.write(err.message); response.end(); }else{ response.writeHead(200,'Content-Type':'text/html;charset="UTF-8"'); response.write(data); response.end(); } }); break; case '/detail': //商品详情页 fs.readFile("./detail.html",function(err,data){ if(err){ response.writeHead(400,{'Content-Type':'text/plain;charset="UTF-8"'}); response.write(err.message); response.end(); }else{ response.writeHead(200.{'Content-Type':'text/html;charset="UTF-8"'}); response.write(data); response.end(); } }); break; default: //处理来自本地目录的文件,主要是一些静态资源文件,搭建静态服务器还有其他方法 var fileName = url.pathname.substring(1); //去掉前导'/' var types = getType(fileName.substring(fileName.lastIndexOf('.')+1)); console.log(fileName); //取得文件类型 css js .... //异步读取文件,并将内容作为单独的数据模块传给回调函数 //对于确实很大的文件,使用流API fs.createReadStream()更好 fs.readFile(fileName,function(err,data) { if(err){ response.writeHead(400,{'Content-Type':'text/plain;charset="UTF-8"'}); response.write(err.message); response.end(); }else{ response.writeHead(200,{'Content-Type':types}); response.write(data); response.end(); } }); break; } }); //判断文件类型的函数 function getType(endTag){ var type = null; switch (endTag) { case 'html': type = 'text/html;charset=UTF-8'; break; case 'htm': type = 'text/html;charset=UTF-8'; break; case 'txt': type = 'text/plain;charset=UTF-8'; break; case 'css': type = 'text/css;charset=UTF-8'; break; case 'js': type = 'application/javascript;charset=UTF-8'; break; case 'manifest': type = 'text/cache-manifest;charset=UTF-8'; break; default: type = 'application/octet-stream'; } return type; }