欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-09 22:32:00
...

简单总结
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的一个模块
以后用到在学吧

相关标签: 后端笔记