# node
- 单线程
- 非阻塞I/O
- 事件驱动
# http
//require表示引包,引包就是引用自己的一个特殊功能
var http = require("http");
//创建服务器,参数是一个回调函数,表示如果有请求进来,要做什么
var server = http.createServer(function(req,res){
//req表示请求,request; res表示响应,response
//设置HTTP头部,状态码是200,文件类型是html,字符集是utf8
res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
res.end("apple");
});
//运行服务器,监听3000端口(端口号可以任改)
server.listen(3000,"127.0.0.1");
# fs
//require表示引包,引包就是引用自己的一个特殊功能
var http = require("http");
var fs = require("fs");
//创建服务器,参数是一个回调函数,表示如果有请求进来,要做什么
var server = http.createServer(function(req,res){
if(req.url == "/fang"){
fs.readFile("./test/xx.html",function(err,data){
//req表示请求,request; res表示响应,response
//设置HTTP头部,状态码是200,文件类型是html,字符集是utf8
res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
res.end(data);
});
}else if(req.url == "/yuan"){
fs.readFile("./test/haha.html",function(err,data){
//req表示请求,request; res表示响应,response
//设置HTTP头部,状态码是200,文件类型是html,字符集是utf8
res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
res.end(data);
});
}else if(req.url == "/0.jpg"){
fs.readFile("./test/0.jpg",function(err,data){
//req表示请求,request; res表示响应,response
//设置HTTP头部,状态码是200,文件类型是html,字符集是utf8
res.writeHead(200,{"Content-type":"image/jpg"});
res.end(data);
});
}else if(req.url == "/bbbbbb.css"){
fs.readFile("./test/aaaaaa.css",function(err,data){
//req表示请求,request; res表示响应,response
//设置HTTP头部,状态码是200,文件类型是html,字符集是utf8
res.writeHead(200,{"Content-type":"text/css"});
res.end(data);
});
}else{
res.writeHead(404,{"Content-type":"text/html;charset=UTF-8"});
res.end("没有这个页面");
}
});
//运行服务器,监听3000端口(端口号可以任改)
server.listen(3000,"127.0.0.1");
# url
var http = require("http");
var url = require("url");
var server = http.createServer(function(req,res){
//url.parse()可以将一个完整的URL地址,分为很多部分:
//host、port、pathname、path、query
console.log(req.url)
var pathname = url.parse(req.url).pathname;
//url.parse()如果第二个参数是true,那么就可以将所有的查询变为对象
//就可以直接打点得到这个参数
var query = url.parse(req.url,true).query;
console.log(typeof query)
//直接打点得到这个参数
var age = query.age;
console.log("pathname:" + pathname)
console.log("age:" + age);
res.end();
});
server.listen(3000,"127.0.0.1");
# post get
post接口在url拿不到数据,需要通过监听data和end事件拿到数据,同时需要通过querystring转化数据格式
在请求体中使用req.method判断是不是post
# formidable
需要安装
npm i -S formidable
var formidable = require('formidable'),
http = require('http'),
util = require('util');
http.createServer(function(req, res) {
if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
// parse a file upload
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
});
return;
}
// show a file upload form
res.writeHead(200, {'content-type': 'text/html'});
res.end(
'<form action="/upload" enctype="multipart/form-data" method="post">'+
'<input type="text" name="title"><br>'+
'<input type="file" name="upload" multiple="multiple"><br>'+
'<input type="submit" value="Upload">'+
'</form>'
);
}).listen(8080);
# 模板
# 整理
- 创建http服务
const http = require("http")
http.createServer(function(req,res){
}).listen(3000,()=>{
console.log("server is ok")
})
- 返回数据
//设置HTTP头部,状态码是200,文件类型是html,字符集是utf8
res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"})
res.end("xxx")
- 读取文件
const fs= require("fs")
fs.readFile("./xxx",function(err,data){
if(err){
throw err
}else{
res.end(data);
}
})
- url解析参数
var url = require("url");
//url.parse()可以将一个完整的URL地址,分为很多部分:
//host、port、pathname、path、query
var pathname = url.parse(req.url).pathname;
///url.parse()第二个参数为true,query属性会生成一个对象,
//如果为false,则返回url对象上的query属性会是一个未解析,未解码的字符串
//默认为false
//就可以直接打点得到这个参数
var query = url.parse(req.url,true).query;
console.log(typeof query)
//直接打点得到这个参数
var age = query.age;
- 不处理小图标请求
if(req.url == "/favicon.ico"){
return;
}
- fs创建文件和目录
//若创建的文件/文件夹已存在会抛出异常
fs.mkdir("./album/aaaa12",function(err){
if(err){
throw err
}
});
7.fs 检测选取文件是否是对应 fs.stat() 方法用于查询文件信息,可以用于查询文件的大小、创建时间、权限等相关信息。
//若不存在该文件会抛出异常
fs.stat("./album/aaa",function(err,data){
//检测这个路径,是不是一个文件夹
if(err){
throw err
}
console.log(data.isDirectory());
console.log(data.isFile());
});
- fs open
fs.open(path, flags[, mode], callback)
- r 打开文本文件进行读取,数据流位置在文件起始处
- r+ 打开文本文件进行读写,数据流位置在文件起始处
- w 如果文件存在,将其清零,不存在创建写入文件。数据流位置在文件起始处
- w+ 打开文件进行读写,如果文件存在,将其清零,不存在创建写入文件。数据流位置在文件起始处
- 文件删除
fs.unlink(path, callback)
var fs = require('fs');
var path = require('path');
var file = path.join(__dirname, './fs.txt');
if( fs.existsSync(file) ){
fs.unlink(file, function(err){
if(err) {
console.log(err);
}
})
}
- 文件夹
fs.rename(oldPath,newPath,callback)
该方法可用于移动或重命名指定文件。oldPath参数为该文件原来的路径,newPath参数为该文件移动或重命名之后的路径,这两个参数都必须能传入文件完整的绝对物理路径。callback回调参数当中只有一个错误信息参数,一般在oldPath当中指定的文件不存在或者该操作失败时触发调用。
fs.rmdir(path,callback)
该方法可以用于删除一个空目录。其中path为该目录的绝对物理路径,callback回调函数当中也只有一个错误信息参数,一般在该目录不存在或者删除操作失败时触发调用。 注意:该传入的目录路径当中的目录必须能为一个空目录,否则会出现报错信息,也不能完成删除操作。
- 文件是否存在 fs.access()用于检查到指定path路径的目录或文件的访问权限。其回调函数中有一个参数(err),如果检查失败则会出现错误参数的响应。mode是要检查的权限掩码,它可以是以下枚举值之一:
fs.F_OK - 文件是对于进程是否可见,可以用来检查文件是否存在。也是mode 的默认值
fs.R_OK - 文件对于进程是否可读
fs.W_OK - 文件对于进程是否可写
fs.X_OK - 文件对于进程是否可执行。(Windows系统不可用,执行效果等同fs.F_OK)
使用fs.access()方法检查文件是否存在,可以使用以下方法:
var fs = require('fs');
fs.access('/etc/passwd', function(err) {
console.log(err ? '文件存在' : '文件不存在');
});
使用fs.access()方法检查是否对文件是否有读写权限,可以使用以下方法:
var fs = require('fs');
fs.access('/etc/passwd', fs.R_OK | fs.W_OK, function(err) {
console.lo(err ? '不可操作!' : '可以读/写');
});
- path 得到文件后缀path.extname
var http = require("http");
var url = require("url");
var fs = require("fs");
var path = require("path");
http.createServer(function(req,res){
//得到用户的路径
var pathname = url.parse(req.url).pathname;
//默认首页
if(pathname == "/"){
pathname = "index.html";
}
//拓展名
var extname = path.extname(pathname);
//真的读取这个文件
fs.readFile("./static/" + pathname,function(err,data){
if(err){
//如果此文件不存在,就应该用404返回
fs.readFile("./static/404.html",function(err,data){
res.writeHead(404,{"Content-type":"text/html;charset=UTF8"});
res.end(data);
});
return;
};
//MIME类型,就是
//网页文件: text/html
//jpg文件 : image/jpg
var mime = getMime(extname);
res.writeHead(200,{"Content-type":mime});
res.end(data);
});
}).listen(3000,"127.0.0.1");
function getMime(extname){
switch(extname){
case ".html" :
return "text/html";
break;
case ".jpg" :
return "image/jpg";
break;
case ".css":
return "text/css";
break;
}
}
- path.resolve([from ...], to) 将 to 参数解析为绝对路径,给定的路径的序列是从右往左被处理的,后面每个 path 被依次解析,直到构造完成一个绝对路径。 例如,给定的路径片段的序列为:/foo、/bar、baz,则调用 path.resolve('/foo', '/bar', 'baz') 会返回 /bar/baz。
path.resolve('/foo/bar', './baz');
// 返回: '/foo/bar/baz'
path.resolve('/foo/bar', '/tmp/file/');
// 返回: '/tmp/file'
path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// 如果当前工作目录为 /home/myself/node,
// 则返回 '/home/myself/node/wwwroot/static_files/gif/image.gif'
- path.join([...paths]) path.join() 方法使用平台特定的分隔符把全部给定的 path 片段连接到一起,并规范化生成的路径。
长度为零的 path 片段会被忽略。 如果连接后的路径字符串是一个长度为零的字符串,则返回 '.',表示当前工作目录。如果路径中出现"..",那么它前面的路径片段将被丢失。
console.log(path.join('foo','we',"..",'file'))
//foo\file
- __dirname
__dirname 当前目录路径
- 上传图片 使用插件formmidable
var http = require("http");
var formidable = require('formidable');
var util = require("util");
var fs = require("fs");
var path = require("path");
//创建服务器
var server = http.createServer(function(req,res){
//如果你的访问地址是这个,并且请求类型是post
if(req.url == "/dopost" && req.method.toLowerCase() == "post"){
//Creates a new incoming form.
var form = new formidable.IncomingForm();
//设置文件上传存放地址
form.uploadDir = "./uploads";
form.encoding = 'utf-8';
//执行里面的回调函数的时候,表单已经全部接收完毕了。
form.parse(req, function(err, fields, files) {
//if(err){
// throw err;
//}
//console.log(util.inspect({fields: fields, files: files}));
//时间,使用了第三方模块,silly-datetime
var ran = parseInt(Math.random() * 89999 + 10000);
var extname = path.extname(files.tupian.name);
//执行改名
var oldpath = __dirname + "/" + files.tupian.path;
//新的路径由三个部分组成:时间戳、随机数、拓展名
var newpath = __dirname + "/uploads/" + ran + extname;
//改名
fs.rename(oldpath,newpath,function(err){
if(err){
throw Error("改名失败");
}
res.writeHead(200, {'content-type': 'text/plain;charset=UTF-8'});
res.end("成功");
});
});
}else if(req.url == "/"){
//呈递form.html页面
fs.readFile("./form.html",function(err,data){
res.writeHead(200, {'content-type': 'text/html'});
res.end(data);
})
}else{
res.writeHead(404, {'content-type': 'text/html'});
res.end("404");
}
});
server.listen(3000);
# 图片处理
链接 (opens new window) 只要服务器需要处理图片,那么这个服务器就要安装graphicsmagick软件。免费的。
装完之后,可视化工具一点用都没有,从桌面上删除。我们要把安装目录设置为环境变量。
控制台CMD命令:
//格式转换
gm convert a.bmp a.jpg
//更改当前目录下*.jpg的尺寸大小,并保存于目录.thumb里面
gm mogrify -resize 320x200 danny.jpg
nodejs要使用graphicsmagick,需要npm装一个gm的包。
node.js命令 node.js缩略图的制作:
var fs = require('fs');
var gm = require('gm');
gm('./danny.jpg')
.resize(50, 50,"!")
.write('./danny2.jpg', function (err) {
if (err) {
console.log(err);
}
});
node.js头像裁切:
gm("./danny.jpg").crop(141,96,152,181).write("./2.jpg",function(err){
//141 96 是宽高 。 152 181是坐标
});)