# 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);

# 模板

# 整理

  1. 创建http服务
const http = require("http")
http.createServer(function(req,res){
	
}).listen(3000,()=>{
	console.log("server is ok")
})
  1. 返回数据
//设置HTTP头部,状态码是200,文件类型是html,字符集是utf8
res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"})
res.end("xxx")
  1. 读取文件
const fs= require("fs")
fs.readFile("./xxx",function(err,data){
	if(err){
		throw err
	}else{
		res.end(data);
	}
})
  1. 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;
  1. 不处理小图标请求
if(req.url == "/favicon.ico"){
	return;
}
  1. 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());
	});
  1. fs open
fs.open(path, flags[, mode], callback)
  • r 打开文本文件进行读取,数据流位置在文件起始处
  • r+ 打开文本文件进行读写,数据流位置在文件起始处
  • w 如果文件存在,将其清零,不存在创建写入文件。数据流位置在文件起始处
  • w+ 打开文件进行读写,如果文件存在,将其清零,不存在创建写入文件。数据流位置在文件起始处
  1. 文件删除
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);
    } 
  })
 }
  1. 文件夹
fs.rename(oldPath,newPath,callback)

该方法可用于移动或重命名指定文件。oldPath参数为该文件原来的路径,newPath参数为该文件移动或重命名之后的路径,这两个参数都必须能传入文件完整的绝对物理路径。callback回调参数当中只有一个错误信息参数,一般在oldPath当中指定的文件不存在或者该操作失败时触发调用。

fs.rmdir(path,callback)

该方法可以用于删除一个空目录。其中path为该目录的绝对物理路径,callback回调函数当中也只有一个错误信息参数,一般在该目录不存在或者删除操作失败时触发调用。 注意:该传入的目录路径当中的目录必须能为一个空目录,否则会出现报错信息,也不能完成删除操作。

  1. 文件是否存在 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 ? '不可操作!' : '可以读/写');
});
  1. 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
  1. __dirname

__dirname 当前目录路径

  1. 上传图片 使用插件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是坐标
});)
最后更新: 8/23/2021, 8:40:17 AM