Node.js笔记--Day2

本文详细介绍了如何使用Node.js的http模块创建web服务器,包括基本步骤、请求对象、响应对象以及解决中文乱码问题。还探讨了域名、端口和模块化概念,特别是Node.js中的模块分类、加载、作用域和共享。此外,讲解了npm包管理和包的使用,以及如何通过npm安装和使用第三方模块,如moment进行日期格式化。
摘要由CSDN通过智能技术生成

目录

1.【http模块】

1.1 什么是 http 模块

1.2 IP地址

1.3 域名和域名服务器

1.4 端口号

2.【创建最基本的web服务器】

2.1创建web服务器的基本步骤

2.2 req 请求对象

2.3 res 响应对象 

2.4解决中文乱码的问题 

 3.【根据不同的 url 响应不同的 html 内容】

3.1核心实现步骤

3.2动态响应内容

 4.【模块化】

4.1什么是模块化

4.2编程领域中的模块化

4.3模块化规范 

5.【Node.js中的模块化】

5.1 node.js中模块的分类

5.2 加载模块

5.3 Node.js 中的模块作用域

5.4 向外共享模块作用域中的成员

5.5 Node.js 中的 模块化规范

6.npm与包

6.1  包

6.2 npm 初体验



1.【http模块】

1.1 什么是 http 模块

        http 模块是Node.js官方提供,用来创建web服务器模块,通过http.createServer()方法

        如果要希望使用http模块创建Web 服务器,则需要先导入它:

        const http = require( 'http')

1.2 IP地址

        IP地址就是互联网上每台计算机的唯一地址

        IP地址的格式 :通常用“点分十进制”表示成(a.b.c.d)的形式,都是0~-255之间的十进制整数。

               例如:用点分十进表示的市地址(192.168.1.1)

       注意:

         1. 互联网中每台Web服务器,都有自己的IP地址,例如:大家可以在Windows的终端中运行 ping www.baidu.com命令,即可查看到百度服务器的IP地址。

        2.在开发期间,自己的电脑既是一台服务器也是一个客户端,为了方便测试,可以在自己的浏览器中输入127.0.0.1这个IP地址。就能把自己的电脑当做一台服务器进行访问了。

    1.3 域名和域名服务器

        域名(Domain Name)地址 :一套字符型的地址方案
        域名服务器(DNS,Domain name server) :IP地址域名一一对应的关系
        域名服务器就是提供IР地址和域名之间的转换服务的服务器。

        注意 :

        1.单纯使用IP地址,互联网中的电脑也能够正常工作。但是有了域名的加持,能让互联网的世界变得更加方便.

        2.在开发测试期间,127.0.0.1对应的域名是localhost,它们都代表我们自己的这台电脑,在使用效果上没有任何区别。

        

1.4 端口号

        每个web服务都对应一个唯一的端口号。客户端发送过来的网络请求,通过端口号,可以被准确地交给对应的web服务进行处理。

        注意 :

        1.每个端口号不能同时被多个web 服务占用。
        2.在实际应用中,URL中的80端口可以被省略

2.【创建最基本的web服务器】

2.1 创建web服务器的基本步骤

        1.导入 http模块
        2.创建web 服务器实例
        3.为服务器o例邦定 request 事件,监听客户端的请求

        4.启动服务器

        示例代码:

// 1.导入 http模块
const http = require('http');
// 2.创建 web 服务器实例
const server = http.createServer();
// 3.为服务器实例绑定 require 事件,监听客户端的请求
server.on('require', function(req, res) {
        console.log('Someone visit our web server.');
    })
    // 4.启动服务器
server.listen(8080, function() {
    console.log('server running at http://127.0.0.1:8080');
})

        ctrl+c停止服务器    80端口号可以省略 

2.2 req 请求对象

        调用通过server.on()为服务器绑定的request事件处理函数

        如果想在事件处理函数中,访问与客户端相关的数据属性,可以使用如下的方式:

const http = require('http')
const server = http.createServer()
    // req 是请求对象,包含了与客户端相关的数据与属性
server.on('request', (req, res) => {
    //req.url 是客户端请求的 URL 地址
    const url = req.url
        //req.method 是客户端请求的 method 类型
    const method = req.method
    const str = `Your request url is ${url},and request method is ${method}`
    console.log(str)
})
server.listen(80, () => {
    console.log('server running at http://127.0.0.1')
})

2.3 res 响应对象 

        在服务器的 request事件处理函数中,如果想访问与服务器相关的数据属性,可以使用如下的方式:

        res.end()

        1.res是响应对象,它包含了与服务器相关的数据和属性,例如 :要发送到客户端的字符串

        2.res.end()方法的作用 :向客户端发送指定的内容,并结束这次请求的处理过程

2.4 解决中文乱码的问题 

        当调用res.end()方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要手动设置内容的编码格式 

const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
    //定义一个字符串,包含中文的内容
    const str = `您请求的 URL 地址是 ${req.url},请求的 method 类型为${req.method}`
        //调用res.setHeader()方法,设置Content-Type响应头,解决中文乱码的问题
    res.setHeader('Content-Type', 'text/html; charset=utf-8')
        //调用 res.end()方法 ,将内容响应给客户端
    res.end(str)
})
server.listen(80, () => {
    console.log('server running at http://127.0.0.1')
})

 3.【根据不同的 url 响应不同的 html 内容】

3.1 核心实现步骤

        1.获取请求的 url 地址

        2.设置默认的响应内容为404 Not found

        3.判断用户请求的是否为 / /index.html 首页

        4.判断用户请求的是否为 /about.htm l关于页面

        5.设置 Content-Type 响应头,防止中文乱码

        6.使用 res.end() 把内容响应给客户端

3.2 动态响应内容

const http = require('http')

const server = http.createServer()

server.on('request', (req, res) => {
    // 1.获取请求的url 地址
    const url = req.url

    // 2设置默认的响应内容为404 Not found
    let content = '<h1>404 Not found</h1>'

    // 3,判断用户请求的是否为/或 /index.html 首页
    // 4、判断用户请求的是否为 / about.html 关于页面
    if (url === '/' || url === '/index.html') {
        content = '<h1>首页</h1>'
    } else if (url === '/about.html') {
        content = '<h1>关于页面</h1>'
    }
    // 5.设置 Content-Type响应头,防止中文乱码
    res.setHeader('Content-Type', 'text/html; charset=utf-8')
        // 6.使用res.end()把内容响应给客户端
    res.end(content)
})

server.listen(80, () => {
    console.log('server running at http://127.0.0.1')
})

 4.【模块化】

4.1 什么是模块化

        概念:模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元

4.2 编程领域中的模块化

        概念:就是遵守固定的规则,把一个大文件拆成独立并互相依赖多个小模块

        把代码进行模块化拆分的好处 :

        1.提高了代码的复用性
        2.提高了代码的可维护性

        3.可以实现按需加载

4.3 模块化规范 

        概念:对代码进行模块化的拆分与组合时,需要遵守的那些规则。

                例如:

        1.使用什么样的语法格式来引用模块
        2.在模块中使用什么样的语法格式向外暴露成员

        好处:大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用,利人利己。

5.【Node.js中的模块化】

5.1 node.js中模块的分类

        内置模块

        由Node.js 官方提供的,例如fs、path、http等

        自定义模块

        用户创建的每个.js 文件,都是自定义模块

        第三方模块

        由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载

 5.2 加载模块

        加载内置的fs模块

        const fs = require('fs')

        加载用户的自定义模块

      const custom = require('./custom.js')


        加载第三方模块

        const moment = require('moment')


        注意:

        使用require()方法加载其它模块时,会执行被加载模块中的代码。

5.3 Node.js 中的模块作用域

        模块作用域

        和函数作用域类似,在自定义模块中定义的变量方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域

        好处

        防止了全局变量污染的问题

5.4 向外共享模块作用域中的成员

        module 对象

        在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息

        module.exports对象

        1.在自定义模块中,可以使用module.exports 对象,将模块内的成员共享出去,供外界使用。

        2.外界用 require() 方法导入自定义模块时,得到的就是module.exports所指向的对象。

        共享成员时的注意点

        使用require(方法导入模块时,导入的结果,永远以module.exports指向的对象为准。 

        exports 对象

        由于module.exports单词写起来比较复杂,为了简化向外共享成员的代码,Node 提供了exports 对象。默认情况下,exports 和module.exports 指向同一个对象。最终共享的结果,还是以module.exports 指向的对象为准

       exports和module.exports的使用误区

        时刻谨记,require()模块时,得到的永远是 module.exports 指向的对象 :

        

        注意 :

        为了防止混乱,建议大家不要在同一个模块中同时使用exports和module.exports

5.5 Node.js 中的 模块化规范

        Node.js 遵循了CommonJS模块化规范,CommonJS规定了模块的特性各模块之间如何相互依赖

        CommonJS规定 :

        1.每个模块内部,module 变量代表当前模块。
        2.module变量是一个对象,它的exports属性(即module.exports)是对外的接口
        3.加载某个模块,其实是加载该模块的 module.exports 属性。require()方法用于加载模块。

6.npm与包

6.1  包

        什么是包       

         Node.js 中的第三方模块又叫做,指的是同一个概念,只是叫法不同。

        包的来源

        不同于Node.,js 中的内置模块与自定义模块,包是由第三方个人或团队开发出来的,免费供所有人使用。

        注意:

        Node.js 中的包都是免费且开源的,不需要付费即可免费下载使用。

        为什么需要包

        1.由于Node.js 的内置模块仅提供了一些底层的API,导致在基于内置模块进行项目开发的时,效率很低。

        2.包是基于内置模块封装出来的,提供了更高级、更方便的API,极大的提高了开发效率
        3.内置模块之间的关系,类似于jQuery浏览器内置API之间的关系。

        从哪里下载包

        国外有一家IT公司,叫做 npm, lnc.这家公司旗下有一个非常著名的网站:https:/www.npmjs.com/,它是全球最大的包共享平台

        如何下载包

        npm, Inc.公司提供了一个包管理工具,我们可以使用这个包管理工具,从https://registry.npmjs.org/服务器把需要的包下载到本地使用。
这个包管理工具的名字叫做Node Package Manager (简称npm包管理工具),这个包管理工具随着Node.js 的安装包一起被安装到了用户的电脑上。
大家可以在终端中执行npm -v命令,来查看自己电脑上所安装的npm包管理工具的版本号。

6.2 npm 初体验

        格式化时间的传统做法

        1.创建格式化时间的自定义模块

        2.定义格式化时间的方法
        3.创建补零函数
        4.从自定义模块中导出格式化时间的函数
        5.导入格式化时问的自定义模块
        6.调用格式化时间的函数

          示例代码:

//1.定义格式化时间的方法
function dateFormat(dtstr) {
    const dt = new Date(dtstr)
    const y = dt.getFullYear()
    const m = padZero(dt.getMonth() + 1)
    const d = padZero(dt.getDate())
    const hh = padZero(dt.getHours())
    const mm = padZero(dt.getMinutes())
    const ss = padZero(dt.getSeconds())

    return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
}

//定义补零的函数
function padZero(n) {
    return n > 9 ? n : '0' + n
}

module.exports = {
    dateFormat
}

        格式化时间的高级做法

        1.使用npm包管理工具,在项目中安装格式化时间的包 moment

        2.使用require()导入格式化时间的包
        3.参考moment 的官方API文档对时间进行格式化

          在项目中安装包的命令      

如果想在项目中安装指定名称的包,需要运行如下的命令:

        npm install 包的完整名称

 简写(更推荐):

        npm i 包的完整名称

                        使用 moment 对时间格式化

1.安装moment包

      npm i monent     

2.导入需要的包

 注意:导入的名称,就是装包时的名称

         const moment = require('moment')

         const dt = moment().format('YYYY-MM-DD HH:mm:ss')

         console.log(dt)

   

        初次装包后多了哪些文件

        初次装包完成后,在项目文件夹下多一个叫做 node_modules的文件夹和package-lock.json的配置文件。

        node modules,文件夹用来存放所有已安装到项目中的包。require()导入第三方包时,就是从这个目录中查找并加载包。

        package-lock json配置文件用来记录node_modules目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。

                注意 :

        程序员不要手动修改node_modules 或 package-lockjson文件中的任何代码,npm包管理工具会自动维护它们。

        安装指定版本的包

        默认情况下,使用npm install 命令安装包的时候,会自动安装最新版本的包。如果需要安装指定版本的包,可以在包名之后,通过@符号指定具体的版本,

例如:

npm i moment@2.22.2

        包的语义化版本规范

        包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如2.24.0

        其中每一位数字所代表的的含义如下:
                第1位数字 :大版本
                第2位数字 :功能版本

                第3位数字 :Bug修复版本

版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值