nodejs模块化

模块分类:

内置模块,自定义模块(需要补全路径),第三方模块
require('加载模块时会执行被加载的代码')
nodejs 模块化具有模块作用域,不能直接访问被引入模块内的变量
自定义模块中有module对象,可通过module.exports 可以向外共享成员
自定义模块中有exports对象,默认和module.exports指向同一对象,
require() 得到的永远是 module.exports

commonjs规范:

每个模块内部,module变量代表当前模块
module变量是一个对象,它的expor属性(即module.exports)是对外的接口。
require 一个模块,其实是加载该模块的 module.expoorts属性。

三个内置模块

file 模块

载入模块

let fs=require('fs')

用来读取指定文件中的内容

fs.readFile('./test.text1','utf8',(err,satastr)=>{console.log(satastr)})

用来向指定的文件中写入内容

fs.wirteFile('./file.txt','要写入的str','可以省略,默认utf8',(err)=>{})
path 模块

载入模块

let path=requeire('path')

文件所在的路径

console.log(__dirname)

路径拼接

path.join('url片段1','URL片段2...')

完整的文件名

path.basename(fpath)

去掉扩展名的文件名

path.basename(fpath,'.html')

文件的扩展名

path.extname(fpath)
http 模块

载入模块

let http=require('http')

创建实例

let server=http.createServer()

为服务器实例绑定request事件,监听客户端的请求

server.on('request',function(req,res){
    // 客户端请求的url地址
    console.log(req.url)
    // 客户端请求的类型
    console.log(req.method)
    // 设置响应头:示例为解决返回中文编码问题
    res.setHeader('Content-Type','text/html;charset=utf-8')
    // 向客户端返回一些内容并结束本次请求
    res.end('欢迎访问')
})

启动服务器

server.listen(80,()=>{console.log('服务器启动了:http://127.0.0.1')})

nodemon

自动重启服务,开发期间修改了代码不需要手动重启

npm install -g nodemon

使用nodemon filename.js命令替代node File.js命令来启动服务

express

基于nodejs,快速,开放,极简的web开发框架(基于http模块)

npm i express@4.17.1
先简单创建并启动一个服务

导入express

const express = require('express')

创建服务器实例

const app = express()

监听get请求

app.get('/user',(req,res)=>{})

监听post请求

app.post('/user',(req,res)=>{})

调用 app.listen(端口号,启动成功后的回调函数)启动服务

app.listen(80,()=>{})
具体配置req请求体与res响应体

获取url后面用问号拼接的参数,默认是个空对象

console.log(req.query)

获取url后面的动态参数(冒号占位),如:
app.get('/user/:id',(req,res)=>{})
http://127.0.0.1:80/user/22145
获取的就是22145部分

console.log(req.params)

常见请求体内容格式,可直接通过已有中间件后获取
json 格式要经过内置中间件app.use(express.json())
url-encoded 格式要经过内置中间件app.use(ecpress.urlexcoded({extended:false}))

console.log(req.body)

如果没有配置对应的中间件,则req.body值就是 undefined 。或者也可以通过data,end事件获取其他类型数据,数据量大时可能会触发多次data,每次获取完整数据的一部分

req.on('data',(chunk)=>{console.log('chunk是本次接受的数据')})
req.on('end',()=>{console.log('数据接收完成了')})

经过data,与end事件获取并拼接出查询字符串后,可以用内置的querystring模块,来处理查询字符串,通过这个模块的parse()函数,把查询字符串解析成对象格式

const body=require('querystring').parse('str')

响应内容

res.send({name:'悟空',age:18,gender:'男'})
三个内置中间件

解析json 格式数据

app.use(express.json())

解析 URL-encoded 格式数据

app.use(express.urlencoded({extended:false}))

加载静态资源

app.use(express.static('资源路径'))
app.use('URl前缀:/public',express.static('资源路径'))
自定义中间件

中间件回调函数参数中多一个next参数,且在函数体最后必须调用next()
全局中间件

app.get((req,res,next)=>{next()})

局部中间件

app.get(
    "/user",
    [
        //需要配置多个可以通过数组的形式实现
        (req,res,next)=>{next()},
        (req,res,next)=>{next()}
    ],
    (req,res)=>{}
    )

错误级别中间件,回调函数中多一个err 参数,可以捕获请求过程中发生的错误,防止程序崩溃
注意!!! 错误级别中间件要注册在所有的路由后面

app.use((err,req,res,next)=>{next()})
自定义路由模块

自定义路由模块可以将请求抽离分门别来的抽离出来,便于管理

const express = require('express')
const apiRouter = express.Router()
// 监听get请求示例
apiRouter.get('/',(req,res)=>{})
module.exports=apiRouter

加载路由模块

add.use(require('./router')) 
add.use('URl前缀:/api',require('./router')) 

小虫_top
104 声望3 粉丝