2.Nodejs
1.node.js 全栈开发技术栈
MEAN:mongoDB,express,angular,nodejs
2.nvm
2.1 说明:控制node使用的版本
2.2 安装 npm i nvm -g
2.3 使用
nvm list :显示所有node版本
nvm use 版本号:使用指定node版本
nvm version:显示nvm的版本号
nvm install 版本号:安装指定node版本
2.4 更新npm
npm i npm@latest -g
3.nodejs开发与其他环境开发的区别
3.1 不需要web容器,本身就是一个http协议(web容器)
3.2 对于静态资源的获取,必须亲自手写代码来完成,或者使用指定插件
4.执行
4.1 命令: node 当前目录的文件
4.2 说明:每次修改之后,需要重新执行node
4.3 改善:下载依赖nodemon,每次保存文件都会自动重新编译文件
4.4 本地控制台:在windows命令行,输入node即刻进入类似浏览器控制台的命令内
5.文件读写
5.1 介绍:javascript为了安全考虑,没有对文件读写的API,但是nodejs可以。在nodejs官网的API中,Global内的都是全局模块,例proccess,不需要模块引入,直接使用。
//5.2 异步写入
var msg = 'hello world!';
fs.writeFile('./index,txt',msg,'utf8',(err,data)=>{
if(err){
throw err;
}
console.log(data);
})
//5.3 异步读取
fs.readFile('./index.txt',(err,data)=>{
if(err){
throw err;
}
console.log(data); //默认为Buffer类型
})
//5.4 同步读写
fs.readSyncFile(); fs.writeSyncFile();
6.path
6.1 介绍:一般情况下需要使用绝对路径,方便系统区分目录和文件
//6.2 使用
var path = require('path');
var filepath = path.join(__dirname,'/foo','bar2/asdf');
7.注意点
7.1 异步操作无法通过try-catch来获取异常,可以通过回调中的err参数来获取;----新版node可以
7.2 同步操作可以通过try-catch来获取异常;
7.3 不要使用fs.exitsts(path[,callback])来判断文件是否存在,直接使用err判断即可
7.4 文件操作时避免路径问题,灵活使用path.join( );
7.5 error-first(错误优先),设计API遵守的规则
8.http服务程序
var http = require('http');
var server = http.createServer();
//启动服务
server.on((req,res)=>{
res.setHeader('Content-Type','text/plain;charset=utf-8');
if(req.url === '/index'){
res.end('hello index');
}
})
//监听端口号
server.listen(8080, ()=>{
console.log('http://localhost:8080启动了');
})
8.1 response(ServerResponse)响应
8.1.1 res.write( data [, endcoding] [, callback] );接收字符串和Buffer类型,要继续res.end( )
8.1.2 res.end( [data] [, encoding] [, callback]) ;通知服务器已完成
8.1.3 res.statusCode = 404;手动修改状态码
8.1.4 res.statusMessage = ' Not Found '; 手动修改状态消息
8.1.5 res.setHeader('Content-Type', 'text/plain; charset=utf-8');手动修改响应头
8.1.6 res.writeHead(404, 'Not Found', { 'Content-Type' : 'text/plain; charset=utf-8' }) 手动修改状态及响应头
8.2 request(IncomingMessage)请求
8.2.1 request.headers 获取所有请求的报文头
8.2.2 request.rawHeaders 同上,为数组结构
8.2.3 req.httpVersion 获取请求报文头中的http版本号
8.2.4 req.method 获取请求的方法
8.2.5 req.url 获取请求的路径,包含参数
8.3 对不同路径作出不同响应
var http = require('http');
var url = require('url');
http.createServer((req,res)=> {
//设置响应头,否则中文会乱码
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
var urlObj = url.parse(req.url, true);
if(urlObj.pathname === '/index' ){
res.end('index 你好');
}
})
9.内置url
//var urlObj = url.parse(req.url); //解析请求路径
var urlObj = url.parse(req.url, true); //解析请求路径,并把查询参数转为对象格式
if (urlObj.pathname === "/index") {
console.log(urlObj);
res.end(JSON.stringify(urlObj.query));
}
10.响应html页面
if (urlObj.pathname === "/html") {
//设置响应头,为html类型
res.setHeader("Content-Type", "text/html; charset=utf-8");
fs.readFile(path.join(__dirname, "index.html"), (err, data) => {
if (err) throw err;
res.end(data);
});
}
11.响应静态资源
var mime = require("mime");
else if (urlObj.pathname.startsWith("/static")) {
var filename = path.join(__dirname, urlObj.pathname);
fs.readFile(filename, (err, data) => {
if (err) {
res.end("404 文件不存在");
throw err;
}
// 根据不同文件类型,设置对应的响应头
res.setHeader("Content-Type", mime.getType(filename));
res.end(data);
});
}