零基础入门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的一个模块
以后用到在学吧
上一篇: springboot 设置允许跨域的方法
下一篇: 2021-08-26