零基础入门nodejs 这一篇笔记还不够

简单总结
jQuery.js:一个js库文件,主要是简化了js对DOM对象的操作
Vue.js:一个js库文件,关注于用户界面的视图开发
Node.js:理解为运行在服务端的js,是一个开发平台
Web3.js:是一个和以太坊区块链交互的js库

node.js是事件驱动的,非阻塞I/O模型,单线程,有生态系统npm。
注意非阻塞的单线程I/O模型是通过浏览器底层WebAPI和队列实现异步来实现的

通过nvm(Node Version Manager)来管理一台计算机上的多个node版本
常用命令
nvm version
nvm install latest
nvm install 版本号
nvm uninstall 版本号
nvm list
nvm use 版本号

nvm:nodejs版本管理工具,管理nodejs版本和npm版本

npm:是随同nodejs一起安装的包管理工具,npm管理对应nodejs的第三方插件
(1)允许用户从npm服务器下载别人编写好的第三方包到本地使用
(2)允许用户将自己编写的包上传到NPM服务器供别人使

nodejs本身就是web服务器,不需要apache等web服务器。
nodejs进程监听某个端口,接收到用户请求后,做相应处理后把结果返回给浏览器。

REPL:Read,Eval,Print,Loop(交互式解释器)
在REPL中编写程序(类似于在浏览器控制台写),命令行输入node即可

第一行代码
创建demo.js:console.log('hellow world');
命令行:node demo.js

文件写入操作

var fs = require('fs');
var msg = 'hello world';
var filePath = './hello.txt';
fs.writeFile(filePath, msg, 'utf8', function(err) {
	//err==null 写入成功
	if (err) {
		console.log("fail" + err);
	} else {
		console.log('success');
	}
});

读文件操作

var fs = require('fs');
var filePath = './hello.txt';
fs.readFile(filePath, function(err, msg) {
	if (err) {
		console.log('fail');
	} else {
		console.log(msg);
		msg = msg.toString('utf8');
		console.log(msg);
	}
});

__dirname,__filename,path模块

var fs = require('fs');
var path = require('path');
//__dirname:当前正在执行的js的文件所在的目录
//__filename:当前正在执行的js的文件的绝对路径
//path模块实现路径自动拼接
var filePath = path.join(__dirname, 'hello.txt');
fs.readFile(filePath, 'utf8', function(err, data){
	if (err) {
		console.log('fail');
	} else{
		console.log(data);
	}
});

搭建简单服务器

var http = require('http');
var server = http.createServer();
server.on('request', function(req, res) {
	//解决乱码
	res.setHeader('Content-Type', 'text/plain; charset=utf-8');
	//页面反应
	res.write('hello 你好');
	//对于每一个请求,服务器必须结束响应
	//res.end();


	//获取用户请求的路径req.url
	if (req.url === '/' || req.url === '/index') {
		res.end('hello index');
	} else if (req.url === '/login') {
		res.end('hello login');
	} else {
		res.end('404, not found');
	}

});
//开启监听
server.listen(3000, function() {
	console.log('server started up');
});

nodejs的try-catch只能捕获同步发生的异常,不能捕获异步异常。
对于异步的异常只能通过if判断错误号(err.code)来进行错误处理。

根据用户不同请求做出不同相应页面

var http = require('http');
var fs = require('fs');
var path = require('path');
http.createServer(function(req, res) {
	if (req.url === '/' || req.url === '/index') {
		var filePath = path.join(__dirname, '1.html');
		fs.readFile(filePath, function(err, data) {
			if (err){
				throw err;
			} else {
				res.end(data);
			}
		});
	} else if (req.url === '/1.png') {
		var filePath = path.join(__dirname, '1.png');
		fs.readFile(filePath, function(err, data) {
			if (err){
				throw err;
			} else {
				res.setHeader('Content-Type', 'image/png');
				res.end(data);
			}
		});
	} else if (req.url === '/login') {
		var filePath = path.join(__dirname, '2.html');
		fs.readFile(filePath, function(err, data) {
			if (err){
				throw err;
			} else {
				res.end(data);
			}
		});
	} else {
		res.end('404, not found');
	}
}).listen(3000, function() {
	console.log('http://127.0.0.1/3000');
});

注意:对于html中src中的任何文件,浏览器都会重新请求,所以在if判断的时候需要加上对这个文件目录请求的处理

利用mime来简化访问网页操作

var http = require('http');
var fs = require('fs');
var path = require('path');
var mime = require('mime');
http.createServer(function(req, res) {
	var publicDir = path.join(__dirname, 'public');
	var filePath = path.join(publicDir, req.url);
	console.log(filePath);
	fs.readFile(filePath, function(err, data) {
		if (err) {
			res.end('404');
		} else {
			//通过第三方模块判断不同的资源对应的Content-Type
			res.setHeader('Content-Type', mime.getType(filePath));
			res.end(data);
		}
 	});
}).listen(3000, function() {
	console.log('http://127.0.0.1/3000');
});

把显示网页功能函数挂载到res上

var http = require('http');
var fs = require('fs');
var path = require('path');
var mime = require('mime');

http.createServer(function(req, res) {

	res.render = function(filePath) {
		fs.readFile(filePath, function(err, data) {
			if (err){
				throw err;
			} else {
				res.setHeader('Content-Type', mime.getType(filePath));
				res.end(data);
			}
		});
	}

	if (req.url === '/' || req.url === '/index') {
		var filePath = path.join(__dirname, '1.html');
		res.render(filePath);
	} else if (req.url === '/login') {
		var filePath = path.join(__dirname, '2.html');
		res.render(filePath);
	} else {
		res.end('404, not found');
	}
}).listen(3000, function() {
	console.log('http://127.0.0.1/3000');
});

request对象常用成员, response对象常用成员

var http = require('http');
var fs = require('fs');
var path = require('path');
var mime = require('mime');
http.createServer(function(req, res) {
	console.log(req.headers);	//对象类型请求报文头
	console.log(req.rawheaders);//数组类型请求报文头
	console.log(req.httpVersion);//http版本
	console.log(req.method);	//请求方法
	console.log(req.url);	//请求文件路径
	res.setHeader('Content-Type', 'text/plain; charset=utf8');
	res.statusCode = 210;	//设置相应状态码
	res.statusMessage = 'message';	//设置状态吗对应的消息
	res.writeHead(404,'not found',{	//设置相应头,权限比setHead高
		'Content-Type': 'text/plain; charset=utf8'
	});
	res.write('hello world 你好');	//向浏览器发送数据
	res.end();	//完成
}).listen(3000, function() {
	console.log('http://localhost:3000');
});

通过url模块获取用户get提交的参数,存入json,跳转网页

var http = require('http');
var fs = require('fs');
var path = require('path');
var mime = require('mime');
var url = require('url');
http.createServer(function(req, res) {
	res.render = function(filePath) {
		fs.readFile(filePath, function(err, data) {
			if (err){
				throw err;
			} else {
				res.setHeader('Content-Type', mime.getType(filePath));
				res.end(data);
			}
		});
	}
	var urlObj = url.parse(req.url, true);
	if (req.url === '/' || req.url === '/index') {
		var filePath = path.join(__dirname, '1.html');
		res.render(filePath);
	} else if (req.url.startsWith('/2.html') && req.method == 'get') {
		console.log(urlObj);
		console.log(urlObj.query);
		
		fs.readFile(path.join(__dirname, 'data.json'), 'utf8', function(err, data) {
			if (err && err.code != 'ENOENT') {
				throw err;
			}
			var list = JSON.parse(data || '[]');
			list.push(urlObj.query);

			fs.writeFile(path.join(__dirname, 'data.json'), JSON.stringify(list), function(err) {
				if (err){
					throw err;
				}
				console.log('success');
				res.setHeader('Location', '/index');
				res.statusCode = 302;
				res.statueMessage = 'Found';
				res.end();
			});
		});
	} else {
		res.end('404, not found');
	}
}).listen(3000, function() {
	console.log('http://127.0.0.1/3000');
});

通过url模块获取用户POST提交的参数,存入json,跳转网页

var http = require('http');
var fs = require('fs');
var path = require('path');
var mime = require('mime');
var url = require('url');
var querystring = require('querystring');

http.createServer(function(req, res) {
	res.render = function(filePath) {
		fs.readFile(filePath, function(err, data) {
			if (err){
				throw err;
			} else {
				res.setHeader('Content-Type', mime.getType(filePath));
				res.end(data);
			}
		});
	}
	var urlObj = url.parse(req.url, true);
	//console.log(req.url);
	//console.log(req.method);
	if (req.url === '/' || req.url === '/index') {
		var filePath = path.join(__dirname, '1.html');
		res.render(filePath);
	} else if (req.url.startsWith('/2.html') && req.method == 'POST') {
		//console.log(urlObj);
		//console.log(urlObj.query);
		
		fs.readFile(path.join(__dirname, 'data.json'), 'utf8', function(err, data) {
			if (err && err.code != 'ENOENT') {
				throw err;
			}
			var list = JSON.parse(data || '[]');
			//因为post提交的数据可能很大,所以会分多次提交,每次提交一部分数据。此时需要监听request事件的data时间事件
			//当request对象的end事件被触发时表示所有数据都提交到服务器
			var array = [];
			req.on('data', function(chunk) {
				//此处的chunk就是浏览器本次提交过来的一部分数据, 类型为buffer对象
				array.push(chunk);
			});
			req.on('end', function() {
				//把array中的每个buffer对象集合起来转换为一个buffer对象
				var postBody = Buffer.concat(array);	
				//把获取到的buffer对象转换成一个字符串    
				postBody = postBody.toString('utf8');	//==>txt=aaa&url=ccc
				//console.log(postBody);
				postBody = querystring.parse(postBody);	//==>{txt='aaa',url='ccc'}
				//console.log(postBody);
				list.push(postBody);
				fs.writeFile(path.join(__dirname, 'data.json'), JSON.stringify(list), function(err) {
					if (err){
						throw err;
					}
					console.log('success');
					res.setHeader('Location', '/index');
					res.statusCode = 302;
					res.statueMessage = 'Found';
					res.end();
				});
			});
		});
	} else {
		res.end('404, not found');
	}
}).listen(3000, function() {
	console.log('http://127.0.0.1/3000');
});

underscore压缩与解压缩

var _ = require('underscore');

var names = ['zhang', 'ming', 'hong'];
var ages = [18, 19, 20];
var genders = ['nan', 'nv', 'nv'];

//压缩
var result = _.zip(names, ages, genders);
console.log(result);
//解压缩
result = _.unzip(result);
console.log(result);

underscore的template用法

var _ = require('underscore');
var html = '<h1><%= str %></h1>';
var fn = _.template(html);
var string = 'hello world';
html = fn({str: string});
console.log(html);

加载模块时可以获取被加载模块module.exports=xxx;
xxx可以是数据或者函数
可以在加载js中访问或调用module.exports返回的变量或函数

补充:express开发框架是node.js的一个模块
以后用到在学吧

猜你喜欢

转载自blog.csdn.net/weixin_42172261/article/details/106881930