node-day1

(1)为什么学习node?

  

  

 服务器为中间件

 学习node.js便是为了帮助前端开发人员 打开服务器的黑盒子,了解接口制作、数据处理等,以便更好地配合后端进行协同开发

 案例:node.js中文社区系统(多人社区)

  

(2)什么是node?

  前端:HTML、CSS、JS

  服务器端:node、java、PHP、Python、Ruby(案例:GitHub)、c#、.Net(dot点,发音为dao net)... ...都可以作为服务器端语言,都可以打开web后台服务器黑盒子。

  node.js主要使用js编码

  

   浏览器JS构成:

    

   node.js中构成(服务端不处理页面,所以没有BOM和DOM)

    

   

node.js特性:
  event-driven事件驱动、non-blocking I/O model非阻塞I/O模型

   node.js生态库

   

 小结:

node.js不是新语言、框架、库等,而是js在服务器端的运行环境。是基于Chrome的V8 JavaScript引擎构建的JavaScript运行时环境,浏览器引擎相关参考下面所示

 

(3)node介绍

  1、node能做什么?

    

     等等,主要为服务器和命令行工具

     对于前端来说,主要使用node命令行工具

    

  2、预备知识

    

   3、学习资源

    

  4、学习知识点

    

B/S编程模型:Browser与Server

  

模块化编程

  

异步编程

  

ES6

  

(4)node环境安装

  

  1、 查看当前是否安装node或者已经安装好的版本号

node --version或者node -v

    

   2、官网查看版本进行下载

LTS为Long Time Support长期支持版,即稳定版
Current为当前最新版

  

    

   3、安装

注意:已经安装过的,再次安装会进行覆盖

  一路next傻瓜式安装即可

  4、验证版本,确认是否安装成功

  5、配置环境变量

  

   

(5)使用node执行JS脚本文件

  1、新建helloworld.js脚本

    

  2、切换到脚本目录文件

    CMD与Git Bash都可以

    

     

  3、node执行脚本文件

    如上所示

  4、注意

    

脚本文件命名避免node.js或者中文

    

  5、没有BOM与DOM验证

    

     

     

没有DOM与BOM操作,主要是服务器级别操作,例如读写文件
注意:浏览器中JS无法直接读取或者创建写入文件

  6、浏览器js与node的js宏观对比---结合读写文件

    

1、使用require方法加载fs(file-system文件系统)核心模块
    var fs = require('fs');
2、读取文件
    fs.readFile('读取文件路径','回调函数(error,data)')

    

  案例如下:

    

     

     

默认存储为二进制数据,这里看到的之所以乱码,是因为二进制转为16进制了,通过toString转换即可

    

     

  小结:

  

  7、浏览器不认识node代码

    

    

(6)写文件和简单的错误处理

   1、写文件API

writeFile()

  

   

  案例如下:

   

  

   

  2、完善--错误情况处理,自定义错误提示

  

   错误时error为错误对象,包含具体错误信息

  

   添加错误判断

  

   

  3、写入文件加错误处理

  

  4、小结

error参数作用:判断读写文件操作是否成功

(7)简单的http服务

  

   之前首先利用node执行脚本文件,打印hello world;后来利用fs与API读写文件,接下来使用web服务器实现

核心模块:fs文件系统模块、http服务器模块

   1、核心模块(宏观了解)

1、加载http核心模块
    var http = require('http');
2、创建web服务器
    使用http.createServer()方法创建一个web服务器,返回一个server实例
    var server = http.createServer()
3、服务器提供“数据”服务,接收请求
  server.on('request',function(){...})
4、绑定端口号(3000、5000、8000,端口号下面介绍),启动服务器
  

  

  

   验证如下:

  

  

   

   问题:此时浏览器输入url后一直显示等待响应... ....

  

   之所以会这样,主要因为当前只是接受请求request,还没有设置响应,所以接下来设置响应

  

   

(8)设置并发送响应

  1、参数

    request请求事件回调处理函数,需要接受两个参数:
        Request请求对象(获取客户端一些请求信息,例如请求路径request.url)
        Response响应对象(给客户端发送响应消息)

  

  2、验证如下

/* 1、加载http核心模块 */
var http = require('http');
/*2、创建web服务器
    使用http.createServer()方法创建一个web服务器,返回一个server实例*/
var server = http.createServer();
/*3、服务器提供“数据”服务,接收请求*/
/*
    request请求事件回调处理函数,需要接受两个参数:
        Request请求对象(获取客户端一些请求信息,例如请求路径)
        Response响应对象(给客户端发送响应消息)
*/
server.on('request',function(request,response){
    console.log('收到客户端请求,请求路径为'+request.url)
    /*
        response对象有一个write方法,可以用来给客户端发送响应数据
        write可以使用多次,但最后要用end结束响应,否则客户端会一直等待
    */
    //往response响应流中写数据
    response.write('hello world')
    //告知客户端,服务器的话已经说完了,可以呈递给用户了
    response.end();
})
/* 4、绑定端口号,启动服务器 */
server.listen(3000,function(){
    console.log('服务器启动成功,可以通过localhost:3000进行访问')/*成功日志信息*/
})

  

注意:/favicon.icon为收藏夹图标,浏览器有个默认行为,会去请求收藏夹图标

  3、思考:路由

  

   根据不同请求路径,响应不同内容... ...

  简单复习:

  

(9)根据不同请求路径返回不同数据

  

     1、启动服务器基本步骤

    

  2、端口不能重复使用

    

端口号如果已经被占用,则会启动失败
浏览器默认端口为80端口

  3、默认端口号80验证

    

如果端口号是80,则输入url时只输入localhost或者127.0.0.1也可以访问

  4、响应编写与结束简写

发送响应数据同时,结束响应

    

  5、根据不同请求路径,发送不同结果

    判断分析:所有请求路径以/开头

    

浏览器默认行为:访问网页图标

    

     

  6、商品接口模拟

    

注意:编写好商品数据后,无法直接编写响应数据返回给客户端,需要注意数据类型

    

     验证后发现只能接收字符串和二进制数据,即响应内容数据类型限制

    

     结果:

    

     验证后发现和之前所接触的接口十分相似,简单了解下... ...,这里中文乱码,后续介绍,当然开发时数据都是存储在数据库

    

(10)Node.js中的js---核心模块

  

  1、node中JS支持ES,没有BOM与DOM

  2、核心模块

    

例如:
fs(file system)文件系统模块
os(operation system)操作系统信息模块
http服务构建模块
path路径操作模块

  os案例:

    

    

     上面四个对象为四核

  3、获取内存totalmem

/*获取内存大小,memory内存,单位为字节*/
var totalmem = os.totalmem();
console.log(totalmem)

    

  4、path模块处理路径,获取扩展名extname

var path = require('path');
/*获取扩展名:extension name*/
var extname = path.extname('c:/user/myblog.txt');
console.log(extname)

    

  5、多脚本文件并发执行

普通编写的话:node下同一时间只能读取操作一个脚本文件,如下所示

    

如果想同时执行多个脚本,需要模块化编程

  6、模块化编程

    

     正如之前验证,两个脚本无法同时执行,所以只能通过代码,在执行a.js同时执行脚本文件b.js

node里,可以通过require加载的模块有3种
    1、具名核心模块fs、http、path、os
    2、用户自定义的模块(相对路径必须加./)
    3

    

     验证如下:

    

     

     同理,再添加个c.js

    

     验证如下

    

先进后出,后进先出

  7、模块作用域

在node里,没有全局作用域,只有模块作用域,外部访问不到内部,内部也访问不到外部

    

     验证如下:

    

   小结:

    

注意:
1、后缀名可以省略
2、相对路径的./不能省略,否则会报错(去掉会将其作为核心模块与识别解析)

    

     

     

   8、模块通信

    

   9、模块的导入加载与导出

     首先测试下直接读取别的模块信息

      

       

       读取失败

    接下来试下模块化信息操作,即模块导入与导出

    

每个文件模块都提供了一个对象:exports,默认exports是一个空对象

    

对象是动态的,所以如果想在其他模块使用该模块的数据,需要将其挂载到exports对象上,即动态添加成员

    

     此时结果为{foo:hello}

     

     也可以导出方法

    

     

  思考:

    

     这里的两个add并不一样,一个是模块里的函数,另一个是挂载到exports对象上的方法

注意:只要是没有挂载到exports对象上的数据或方法,在另一个模块里都获取不到

    

     

     修改如下:

      

   10、模拟核心模块封装

      

(11)ip地址&&端口号介绍

   1、ip与端口号

ip用来定位计算机
端口号用来定位应用程序

  

   

   小结:

    

     

  2、端口号补充

    

范围:0-65535
网站上线部署时用80默认端口即可
开发阶段推荐用3000、5000没有实际含义的端口号即可

(12)响应内容类型Content-type

  1、中文乱码问题

    首先编写http服务模块基本框架

    

     可以同时开启多个服务,但要确保不同服务占用不同的端口号

    

    加上中文,再次验证如下

    

     

乱码原因剖析:之所以乱码,是因为服务器发送的数据为utf-8编码即国标编码,但浏览器不知道。
      浏览器在不知道服务器响应内容的编码情况下,会按照当前系统的默认编码去解析(中文操作系统默认gbk编码)

  2、解决方法,声明编码协议类型

    

     案例如下:

    

     乱码与设置响应头格式对比:

      

       

  3、除了普通文本text/plain,还有其他格式,例如百度

    

  4、Content-Type作用

在http协议里,Content-Type作用为设定信息类型

  代码如下所示

    

  案例根据不同Content-Type返回不同类型,如下所示

  

  

如果Content-Type为html,浏览器会将其进行解析;如果是普通文本,则会将其解析为普通字符串文

   5、发送文件中的数据及Content-Type内容类型

    打开百度审查,即可得知,请求页面时,本质获取的是字符串,但为html内容字符串。然后浏览器对其进行解析渲染

    

  6、测试

    首先在文件夹下存放不同类型的资源文件

    

     需求:请求路径不同,访问不同的资源文件

    ①首先读取html文件

    

     详细设置

    

     接下来修改HTML文件内容,再次刷新页面,这里注意:不用重启服务器

这里之所以不用重启服务器,因为js脚本文件并未更新,每次只是重新读取html文件,所以这里直接刷新后会重新读取

    ②读取图片

      这里拓展对照表

      

       

       查找图片对应Content-Type类型

      

    ③统一资源定位符

      

    ④小结

      

(13)总结

    

     

     接口对象:

    

     核心模块:

    

     http网络服务构建模块:

    

     框架:

    

目前为止的一些操作,都是原生语法操作,例如http网络服务模块相关操作比较繁琐;所以后期学习express简化操作;所以这里会先使用原生,后用express框架
类似于JS操作DOM,后续学习jQuery简化DOM操作语法

.

原文地址:https://www.cnblogs.com/fightjianxian/p/12124680.html