Node.js之我见

1. 对 Node.js 的理解

(1)node.js

  • Node.js不是一门新的语言,是一个javascript的运行环境,在node的环境下;我们可以使用js脱离浏览器端独立运行.

  • node里有模块化的概念,node里的npm(包管理器,node,package,manager)可以快速的进行模块的管理.

  • 我们可以使用node的http模块,进行服务器的搭建,或者使用express模块,进行服务器的快速搭建.

(2)node的特点:

  • 1 . 单线程
    2 . 异步的非阻塞式();
    3. 以事件驱动;
  • node的 使用场景:
    1. 后台开发;
    2. 使用node自带的npm功能,方便的安装,删除,管理第三方模块, 不是说想用npm就一定写node代码,npm只要安装node环境;可以只用npm,不写node.js的任何代码;
    3. node的兼容性很好,windows, linux, macOS均可使用 node环境,node的0.6版本之后,会直接预装npm不用单独安装npm.

2. http:

  • node里搭建服务器使用的是http模块有一些常用的模块不需要npm下载,而node预装好的 http模块 已经安装好,不需要在进行安装。

1).引入对应的模块 require(“模块名)

var  http =require("http");

2).http协议:基于请求和响应的模式,如果响应完毕,服务器与客服端断开链接,http是典型的短链接。
3) .createServer :

1. 创建server;
2. 设置监听,为了监听是否有人访问服务器 所以必须设置监听,因为不知道会什么时候访问服
 务器,监听一旦设置,服务端会在底层开启一个死循环,不断监听是否有人发起请求,一旦有
 请求会触发回调函数。
 
3. 请求头和请求体的理解:
 (1)、req(requres对象)请求对象
    ① 请求头:请求头很短,包含本次请求的基本信息,请求头会发起请求时被浏览器直接解析
        常用的req属性:
        url:当前的路径
        method:当前的请求方式(get/post)
        
    ② 请求体:当post请求时,要传递的数据会存放在请求体里,那么请求体会很大,在获取
    post数据时,默认情况下无法一次性获取,我们需要分段获取,这时就需要监听post数据
    传来的一个事件,在监听的回调里做数据拼接。
    
	③ 与post请求者有关的方法:
        data: 当post的请求数据传递过来时,会触发该事件,所以我们需要监听该事件
        end:当post请求的数据传递完毕时,会触发该事件,所以我们也需要监听该事件
 
(2)、 res(response对象)响应对象
       响应头/响应体
       响应头:设置给前端传递数据时,数据的一些配置信息,如文件格式,编码格式等
       writeHead(响应码,对象)第二个参数如果不写系统会自动添加,值是默认值
       
       响应体:决定想前端返回什么内容
       res.write()

4).创建一个服务器,返回值是服务器对象

var server=http.createServer(function (req,res) {
    console.log(req.url,req.method);
    /*
    req:  请求对象(request),里面储存了网络请求的所有信息
    res: 相应对象(response),我们会使用该对象的本次请求做出回应
    createServer里的回调函数当接受前台的请求时会触发该函数
     */
    //设置响应头
    res.writeHead(200,{
        "content-type":"text/html;charset=utf-8"
    });
     res.write("<h2>这是标题2标签");
    res.end("响应结束!");
});

5) .设置监听的端口号

server.listen(3000);

3.fs模块:

fs模块 : node专门用来处理文件的模块
  1. 引入fs模块
const fs =  require('fs');
  1. 读取文件内容
fs.readFile("readme.txt","utf-8",function (err,data) { //readme.txt 文件已经写好
    if (err){
        console.log(err);
    } else{
        console.log(data);
    }
})
console.log("aaa");

4.event监听:

  1. 引入事件监听:
const eventEmitter = require('events');
  1. 创建事件监听对象
const event=new eventEmitter();
  1. 设置一个监听
/*
on(监听的名字,监听对应的回调函数)
 */
event.on("an",function () {
    console.log("监听到此事件");
});

// 触发事件emit (触发的事件名)
setTimeout(function () {
    event.emit("an");
},2000);

5.modules:

node.js的核心思想
  • 模块(modules)和包(package);
    模块本质上是一个文件,该文件的类型可以是js,json,也可以是其他语言编译过后的文件(c,c++)

  • 优点:可以方便的实现代码的抽离和复用

  • 为了方便的实现模块化,node给每一个文件都设置了require和exports功能

  • require是为了引用外部的模块, exports是引用的文件的入口对象,是唯一入口,每当我们引用一个模块时,系统都会返回给我们其对应文件的exports对象

    	//坑点:引入自己的模块,路径前面加 "./ "
    	const per=require("./6-persson");
    	// console.log(per.name);
    	per.setName("姓名");
    	console.log(per.getName());
    	// per.getName("别的");
    	// console.log(per.getName());
    	const phone=require("./7-phone");
    	const p1=new phone("华为");
    	
    	p1.call();
    
    

6.url:

/*
  node里的url包 专门用来处理网络地址
 */
let url=require("url");
let urlStr="http://www.baidu.com:8080/a/b/c/d/index.html?name=zhangsan&age=20#sPage";
/*
# :哈希值 该值不会传到服务器,其作用是为了控制页面的偏移
 */
// 把 url地址解析成地址   第二个参数填true,系统会自动解析query字符串,将其转化成对象
let urlobj=url.parse(urlStr,true);
console.log(urlobj);
console.log(urlobj.query.name,urlobj.query.age);
/*
 protocol: '协议名',
  slashes: 协议名后面是否加双斜杠
  auth: 认证授权,
  host: 域名加端口号,
  port: '端口号',
  hostname: '域名',
  hash: '哈希值',
  search: '?+参数',
  query: '',
  pathname: '/a/b/c/d/index.html',
  path: '/a/b/c/d/index.html?name=zhangsan&age=20',
  href:
   'http://www.baidu.com:8080/a/b/c/d/index.html?name=zhangsan&age=20#sPage'



   protocol: 协议名
  slashes: 协议名后面是否加双斜杠
  auth: 认证授权
  host: 域名+端口号
  port: 端口号
  hostname: 域名
  hash: 哈希值
  search: ?+参数
  query: 参数
  pathname: 路径
  path: 路径+参数
  href: 完整url
 */

7.package:

:本质上是一个文件夹(目录) ,是由多个模块组成的,npm(node,package,manager)包管理器,管理的就是包;

  • node对于报的管理,遵循的是common.js规范(规定了js脱离浏览器端之后的一些标准,语法等)

  • 在引用包时直接写包名即可, 这时需要指定包的入口文件。如果不指定入口文件,系统默认为index.js;如果想要自己指定入口文件需要到对应包的package.json里,修改main字段后的文件改成自己想要的

  • common.js规定,在创建或下载包时,每个包里必须要有一个package.json文件,该文件里储存了与当前包里有关的所有数据的配置信息(包括包的入口文件)

  • node允许我们使用交互式的方法创建package.json
    1、进入到对应包的目录下
    cd 目录

    windows:dir 查看当前目录下所有文件
    mac: ls 查看当前目录下的所有文件

    2、 npm init /npm init -y;

  • 如果想引用系统的包
    命令:

     npm i 包名;
     npm install 包名
     npm i包名@ 版本号
     npm install  包名@ 版本号
    

    先要保证先前项目里有package.json 文件
    那么,有了package.json之后,所有下载的包都会在里面产生依赖并记录,
    好处: 以后在上传或者传递项目时不需要传送node_modules文件夹,接收者在拿到项目文件后,只需要运行npm i/ npm install 命令 ,就可以重新安装所有的依赖包。

8.path:

path包, node里专门用来处理路径的模块化包

引入path包

var path = require("path");

9.util:

node 里的util包,用来做继承;
引入:let util=require("util");

10.events_module:

let eventE=require("events");
//创建event对象
let event=new eventE();
  • events模块是node里很多模块的基类,如http.fs这些模块都是直接或者间接继承与events所以http,fs这些模块都是可以实用化events的方法如on(),emit()等;
监听:
event.on("eventone",function () {
    console.log("这是eventone");
})
一次监听:
event.once("onevent",function () {
    console.log("一次性触发");
})
/*
设置最大监听数 emitter.setMaxListeners()设置监听数
 */
event.setMaxListeners(12);
event.on('abc',function () {
    console.log("abc");
});
event.on('abc',function () {
    console.log("abc");
});
event.on('abc',function () {
    console.log("abc");
});
event.on('abc',function () {
    console.log("abc");
});
event.on('abc',function () {
    console.log("abc");
});
event.on('abc',function () {
    console.log("abc");
});
event.on('abc',function () {
    console.log("abc");
});
event.on('abc',function () {
    console.log("abc");
});
event.on('abc',function () {
    console.log("abc");
});
event.on('abc',function () {
    console.log("abc");
});
event.on('abc',function () {
    console.log("abc");
});

event.emit("abc");

11.express:

express模块 是node里对http模块的再次封装

Express是一个自身功能极简,完全是路由和中间件构成一个web开发框架:从本质上来说,一个Express应用就是在调用各种中间件。

/*
             中间件
           语法:  app.use(路由(可省略), 函数(error,req,res,next))(三个参数的是让error去掉)

           中间件是在请求开始与请求结束中间需要做的一些额外的操作,我们在中间件里一般不会做请求的返回,都会让该中间件向下执行,向下执行next

           使用场景
           1 处理特殊的请求设置,body-parser
           2 实现cors跨域资源共享(cross-origin-resource-sharing)

          中间件与路由的区别
          1 使用层面上,在中间件里去处理额外的逻辑不做数据的返回,真正的数据返回还要留给路由去处理
          2 在路由参数上,中间件可以省略,路由不省略,中间件对路由
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值