nodejs学习-1

76 阅读3分钟

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