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'))
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。