js的32天(node的模块化讲解)

node的模块化划分

内置模块(不需要安装)

http(提供http服务的)

fs(fileSystem文件系统)

url(url地址)

path(路径)

event(事件源)

net(通信)

lo(流)

......

第三方模块(需要安装)

express

md5

jwt

...

node的模块化

基于common.js (服务端的模块技术) 主要使用到的是require.js

require.js的相关操作

基于common.js (服务端的模块技术) 主要使用到的是require.js

require.js的相关操作

导入 require

const 变量名 = require('路径地址')

//require导出 他可以省略对应的js后缀 导入的是文件夹默认去找文件夹下index.js文件

// const obj = require('./require.js的基本使用')

const {age,name,arr,sayHello} = require('./require.js的基本使用')

const obj = require('./hello')

// console.log(obj.age);

// console.log(obj.arr);

// console.log(obj.name);

// obj.sayHello()

sayHello()

console.log(obj.name);

导出 module.exports

module.exports = 导出的内容

//导出的内容

//只能导出一遍

module.exports = {

name:

'

jack',

age:18,

arr:[1,2,3],

sayHello(){

console.log('hello');

}

}

注意事项(如果需要导入 必须先导出)

HTTP模块讲解

概述:

http模块是提供http服务的,他可以提供对应的接口供对应的客户端(http请求)来访问

入门使用

1. 导入对应的模块包

const http = require('http')//所有的不是自己书写的模块填入对应的对应的模块名(自己书 写的模块必须填入路径名 携带./)

2. 创建对应的服务(监听对应的ip地址和端口号)

let server = http.createServer()

//必须传入端口号 主机名默认为localhost (1-65525)

server.listen('8888',()=>{

console.log('server is running at localhost:8888')

})

3. 相关处理(在对应的服务创建的时候传入对应的处理函数进行处理)

let server = http.createServer((req,res)=>{

//req表示请求(用来获取相关的请求详情) res表示响应(设置相关内容给到别人)

console.log(req.url) //获取请求地址

console.log(req.method) //获取请求方式

res.end() //响应结束

})

代码

//导入模块

const http = require('http')

//创建服务 使用createServer方法 传入一个处理函数 处理函数内容会存在俩个参数 分别是请求对象和

响应对象

let server = http.createServer((req,res)=>{

console.log(req.url) //获取请求地址

console.log(req.method) //获取请求方式

res.end('hello node!!') //响应结束

})

//监听端口号

server.listen('8888',()=>{

console.log('server is running at localhost:8888')

})

浏览器访问 

中文乱码解决

//中文会出现乱码 乱码的原因是我响应出去的数据格式和对应的浏览器不一致

//设置响应出去的内容格式

//通过响应来设置一个内容格式的响应头

res.setHeader('Content-type','text/html;charset=utf-8')

路由处理

使用对应的url模块的parse方法获取对应的路由地址

//导入模块

const http = require('http')

//url模块 用于处理对应的url

const {parse} = require('url')

//创建服务 使用createServer方法 传入一个处理函数 处理函数内容会存在俩个参数 分别是请求对象和

响应对象

let server = http.createServer((req, res) => {

res.setHeader('Content-type', 'text/html;charset=utf-8')

//得到路由地址

let router = parse(req.url).pathname

console.log(router);

switch (router) {

case

'

/user':

res.end('用户页面')

break;

case

'

/home':

res.end('主页')

break;

case

'

/list':

res.end('列表页')

break;

default:

res.end('欢迎来到某某系统')

}

})

//监听端口号

server.listen('8888', () => {

console.log('server is running at localhost:8888')

})

利用http模块完成一个登录注册案例

根据id来获取对应的用户

case

/searchByID"://根据id查找对应的用户 get

//监听请求数据传递 获取传递的数据id http://127.0.0.1:9999/searchByID?id=1

// req.url存在传递的数据 对于的数据里面?传递的参数进行提取

// console.log(queryByUrl(req.url));

//得到get传递的参数

// let params = queryByUrl(req.url)

let params = parse(req.url,true).query

//通过参数去找对应的uers里面的数据 返回对应的数据

let filterArr = users.filter(user=>user.id == params.id)

if(filterArr[0]){//有这个id

//只能写字符串和buffer类型

res.write(JSON.stringify({

code:200,

message:

'

OK',

data:filterArr[0]

}))

}else{//没有这个id

res.write(JSON.stringify({

code:200,

message:

'

OK',

data:null

}))

}

res.end()

break;

自定义封装的获取url里面参数的方法

//提取对应url地址的数据 返回参数对象

const queryByUrl = (url)=>{

let params = {}

//http://127.0.0.1:9999/searchByID?id=1&name='jack' ===> {id:1}

let strArr = url.split('?')[1].split('&') //id=1 name='jack'

//遍历字符串数组

strArr.forEach(str => {

params[str.split('=')[0]] = str.split('=')[1]

});

return params

}

通过url模块的parse方法来获取get传递的参数

let params = parse(req.url,true).query

登录

case

/login"://登录 post

//获取数据 body里面 观察者模式(event对象 http模块里面导入了event模块)

//body里面的数据是分段传递的

//监听请求数据的传递

req.on('data',(chunk)=>{

params += chunk

})

//监听请求结束

req.on('end',()=>{

//queryString 自动将对应的请求字符串转为对象

let {username,password} = decode(params)

//根据获取的参数进行对应的操作(验证)

let filter = users.filter(user=>{

return username == user.username && password == user.password

})

if(filter[0]){

res.write(JSON.stringify({

code:'200',

message:

'

登录成功',

data:filter[0]

}))

}else{

res.write(JSON.stringify({

code:'200',

message:

'

登录失败',

data:null

}))

}

res.end()

})

break;

获取post请求的参数

监听请求的data事件(分段传递)

监听请求的end事件 (得到是请求体的字符串)

利用querystring模块里面decode方法将字符串转为对象

注册

case

/register"://注册 post

//获取数据

req.on('data',(chunk)=>{

params += chunk

})

req.on('end',()=>{

//将对应的数据转换对象

let {username,password,sex,address} = decode(params)

//判断当前用户是否已经注册

if(users.some(user=>user.username == username)){

//当前用户已经存在

res.write(JSON.stringify({

code:200,

message:

'

当前用户已经注册',

data:null

}))

}else{

//创建一个新的用户

let user = {

id:v4(),

username,

password,

sex:sex?sex:'男',

address:address?address:'中国北京',

createTime:new Date()

}

//添加用户

users.push(user)

res.write(JSON.stringify({

code:200,

message:

'

注册成功',

data:user

}))

}

res.end()

})

break;

uuid第三库使用

安装

npm i uuid -S

导入

const {v4} = require('uuid')

使用对应的方法

id:v4()

热启动(自动监听对应的文件更新)

nodemon插件

npm i nodemon -g

nodemon 文件名

supervisor插件

npm i supervisor -g

supervisor 文件名

md5加密模块的使用

安装

npm i md5 -S

导入

const md5 = require('md5')

使用

md5(需要加密的字符串)

解决跨域

给后端设置响应头

res.setHeader('Access-Control-Allow-Origin','*')

res.setHeader('Access-Control-Allow-Origin-Method','*')

完整登录注册

//实现登录注册功能

//导入模块

const http = require('http')

const {

parse

} = require('url')

//内置querystring parse decode encode

const {

decode

} = require('querystring')

//第三方模块 uuid 生成id的 生成一个32位的id(不重复的)

const {

v4

} = require('uuid')

const {

resolve

} = require('path')

//导入加密的模块 md5 (hash加密法 被破解 加盐(为了安全))

const md5 = require('md5')

//创建一个users数组来装对应的用户

let users = []

//创建服务

http.createServer((req, res) => {

//设置响应头

res.setHeader('content-type', 'text/json;charset=utf-8')

//解决跨域问题

res.setHeader('Access-Control-Allow-Origin','*')

res.setHeader('Access-Control-Allow-Origin-Method','*')

//解构拿出对应的路由地址和get的参数

let {

pathname,

query

} = parse(req.url, true)

//根据路由的路径进行判断

switch (pathname) {

case

"

/login": //登录 post

getPostParams(req).then(({

username,

password

}) => {

//根据获取的参数进行对应的操作(验证)

let filter = users.filter(user => {

return username == user.username && md5(password+user.slat) == user.password

})

if (filter[0]) {

res.write(JSON.stringify({

code: '200',

message:

'

登录成功',

data: filter[0]

}))

} else {

res.write(JSON.stringify({

code: '200',

message:

'

登录失败',

data: null

}))

}

res.end()

})

break;

case

"

/register": //注册 post

getPostParams(req).then(({

username,

password,

sex,

address

}) => {

//判断当前用户是否已经注册

if (users.some(user => user.username == username)) {

//当前用户已经存在

res.write(JSON.stringify({

code: 200,

message:

'

当前用户已经注册',

data: null

}))

} else {

let slat = Math.ceil(Math.random()*1000+1000).toString(36)

//创建一个新的用户

let user = {

id: v4(),

username,

password:md5(password+slat),

sex: sex ? sex : '男',

address: address ? address : '中国北京',

createTime: new Date(),

slat //为了解密

}

//添加用户

users.push(user)

res.write(JSON.stringify({

code: 200,

message:

'

注册成功',

data: user

}))

}

res.end()

})

break;

case

"

/searchByID": //根据id查找对应的用户 get

//监听请求数据传递 获取传递的数据id http://127.0.0.1:9999/searchByID?id=1

// req.url存在传递的数据 对于的数据里面?传递的参数进行提取

// console.log(queryByUrl(req.url));

//得到get传递的参数

// let params = queryByUrl(req.url)

//通过参数去找对应的uers里面的数据 返回对应的数据

let filterArr = users.filter(user => user.id == query.id)

if (filterArr[0]) { //有这个id

//只能写字符串和buffer类型

res.write(JSON.stringify({

code: 200,

message:

'

OK',

data: filterArr[0]

}))

} else { //没有这个id

res.write(JSON.stringify({

code: 200,

message:

'

OK',

data: null

}))

}

res.end()

break;

}

}).listen('9999', '127.0.0.1', () => {

console.log('server is running,at 127.0.0.1:9999')

})

//封装返回对应的post请求的数据

const getPostParams = (req) => {

return new Promise((resolve, reject) => {

let params = ''

//获取数据 body里面 观察者模式(event对象 http模块里面导入了event模块)

//body里面的数据是分段传递的

//监听请求数据的传递

req.on('data', (chunk) => {

params += chunk

})

//监听请求结束

req.on('end', () => {

//queryString 自动将对应的请求字符串转为对象

resolve(decode(params))

})

//监听请求出错

req.on('error', (error) => {

reject(error)

})

})

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容