目录
前言
记录一下Node使用的一些步骤,方便后续复习。
一、fs模块的使用
1.fs读文件
// 1.导入fs模块,来操作文件
const fs = require('fs')
// 2.调用fs.readFile()方法读取文件
fs.readFile('1.txt', 'utf8', function(err, result){
// 判断文件是否读取成功
if(err){
return console.log('文件读取失败!' + err.message)
}
console.log('文件读取成功,内容是:' + result)
})
2.fs写入文件
const fs = require('fs')
fs.writeFile(__dirname + '1.txt','222','utf8', function(err){
// console.log(err)
if(err){
return console.log('文件写入失败!' + err.message)
}
console.log('文件写入成功!')
})
__dirname表示当前文件所在路径
二、path模块的使用
1.path.join()
const path = require('path')
const pathStr = path.join('/a', '/b/c', '../', './d', 'e')
console.log(pathStr)
2.path.basename()
const path = require('path')
// 定义文件的存放路径
const fpath = '/a/b/c/index.html'
const fullName = path.basename(fpath)
console.log(fullName) // index.html
const nameWithoutExt = path.basename(fpath,'.html')
console.log(nameWithoutExt) // index
三、http模块的使用
1.创建最基本的web服务器
// 1.导入http模块
const http = require('http')
// 2.创建web服务器实例
const server = http.createServer()
// 3.为服务器实例绑定request事件,监听客户端的请求
server.on('request', 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')
})
2.req请求对象
// req.url是客户端请求的URL地址
const url = req.url
// req.method是客户端请求的method类型
const method = req.method
3.res响应对象
// 调用res.setHeader()方法,设置Content-Type响应头,解决中文乱码的问题
res.setHeader('Content-Type', 'text/html; charset=utf-8')
// 调用res.end()方法,向客户端响应一些内容
res.end("hello")
四、模块化
模块化是指将一个复杂问题自上而下地逐层把系统划分为若干模块的过程。对于整个系统来说,这些模块是可组合,分解和更换的单元。对于编程领域的模块化就是遵守固定的原则,将一个大文件拆分成多个独立且相互依赖的小模块。简单理解模块化就是在一个js文件中能够引入另一个js文件。
一个js文件就是一个模块,通过module.exports(或者exports)将模块里面的变量向外暴露,在其他模块可以通过require()引入此模块然后使用此模块暴露的变量。
实例:格式化时间模块
// 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())
// `YYYY-MM-DD HH:mm:ss`
return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
}
// 定义补零的函数
function padZero(n){
return n>9 ? n:'0'+n
}
module.exports = {
dateFormat
}
五、express
使用express之前要先npm install express
1.创建最基本的web服务器
// 1.导入express
const express = require('express')
// 2.创建web服务器
const app = express()
// 4.监听客户端的GET和POST请求,并向客户端响应具体的内容
app.get('/user', (req, res) => {
// 调用express提供的res.send()方法,向客户端响应一个 JSON对象
res.send({naem:"zs", age:20, gender:"男"})
})
app.post('/user', (req, res) => {
// 调用express提供的res.send()方法,向客户端响应一个 文本字符串
res.send('请求成功')
})
app.get('/', (req,res) => {
// 通过req.query可以获取到客户端发送过来的查询参数
// 注意:默认情况下,req.query是一个空对象
console.log(req.query)
res.send(req.query)
})
app.get('/user/:id', (req, res) => {
// req.params是动态匹配到的URL参数,默认也是一个空对象
console.log(req.params)
res.send(req.params)
})
// 3.启动web服务器
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
2.路由模块 05.route.js
// 这是路由模块
// 1.导入express
const express = require('express')
// 2.创建路由对象
const router = express.Router()
// 3.挂载具体的路由
router.get('/user/list', (req, res) => {
res.send('Get user list.')
})
router.post('/user/add', (req, res) => {
res.send('Add new user.')
})
// 4.向外导出路由对象
module.exports = router
3.模块化路由
// 1.导入路由模块
const router = require('./05.router')
// 2.注册路由模块
app.use(router)
六、中间件的使用
中间件:用来处理(过滤)请求,最终为路由提供服务
中间件分为四种类型:
①应用级中间件(自定义)
②路由级中间件
③内置中间件
④第三方中间件
1.最简单的中间件函数
const express = require('express')
const app = express()
/*
// 定义一个最简单的中间件函数
const mw = function(req, res, next){
console.log('这是一个最简单的中间件函数')
// 把流转关系转交给下一个中间件或路由
next()
}
// 将mw注册为全局生效的中间件
app.use(mw)
*/
// 这是定义全局中间件的简化形式
app.use((req, res, next) => {
console.log('这是最简单的中间件函数')
next()
})
// 定义多个全局中间件
app.use((req, res, next) => {
// 获取到请求到达服务器的时间
const time = Date.now()
// 为req对象挂载自定义属性,从而把时间共享给后面的所有路由
req.startTime = time
next()
})
app.use((req, res, next) => {
console.log('第三个全局中间件')
next()
})
app.get('/', (req, res) => {
console.log('调用了/这个路由')
res.send('Home page.')
})
app.get('/user', (req, res) => {
console.log('调用了/user这个路由')
res.send('User page.')
})
app.listen(80, () => {
console.log('http://127.0.0.1')
})
2.局部生效的中间件
const express = require('express')
const app = express()
const mw1 = function(req, res, next){
console.log('这是局部生效的中间件')
next()
}
app.get('/', mw1, (req, res) => {
res.send('Home page.')
})
app.get('/user', (req, res) => {
res.send('User page.')
})
app.listen(80, () => {
console.log('http://127.0.0.1')
})
3.错误级别中间件的使用
const express = require('express')
const app = express()
app.get('/', (req, res) => { //路由
throw new Error('服务器内部发生了错误!') //抛出了一个自定义的错误
res.send('Home Page.')
})
// 定义错误级别的中间件,捕获整个项目的异常错误,从而防止程序的奔溃。
app.use((err,req, res, next) => {
console.log('发生了错误!'+err.message)
res.send('Error:'+err.message)
})
app.listen(80, () => {
console.log('http://127.0.0.1')
})
4.内置中间件的使用
const express = require('express')
const app = express()
// 注意:除了错误级别的中间件,其他的中间件,必须在路由之前进行配置
// 通过express.json()这个中间件,解析表单中的JSON格式的数据
app.use(express.json())
// 通过express.urlencoded()这个中间件,来解析表单中的url-encoded格式的数据
app.use(express.urlencoded({extended: false}))
app.post('/user', (req, res) => {
// 在服务器,可以使用req.body这个属性,来接收客户端发送过来的请求体数据
// 默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
console.log(req.body)
res.send('ok')
})
app.post('/book', (req, res) => {
// 在服务器端,可以通过req.body来获取JSON格式的表单数据和url-encoded格式的数据
console.log(req.body)
res.send('ok')
})
app.listen(80, ()=> {
console.log('http://127.0.0.1')
})
5.第三方中间件body-parser的使用
// 导入express
const express = require('express')
// 创建express服务器实例
const app = express()
// 1.导入解析表单数据的中间件body-parser
const parser = require('body-parser')
// 2.使用app.use()注册中间件
app.use(parser.urlencoded({extended: false}))
app.post('/user', (req, res) => {
// 如果没有配置任何解析表单数据的中间件,则req.body默认等于undefined
console.log(req.body)
res.send('ok')
})
// 调用app.listen方法,指定端口号并启动web服务器
app.listen(80, () => {
console.log('Express server running at http://127.0.0.1')
})
七、使用express写接口
const express = require('express')
const app = express()
// 配置解析表单数据的中间件
app.use(express.urlencoded({extended:false}))
// 一定要在路由之前,配置cors这个中间件,从而解决接口跨域的问题
const cors = require('cors')
app.use(cors())
// 导入路由模块
const router = require('./17.apiRouter')
// 把路由模块注册到app上
app.use('/api',router)
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
17.apiRouter.js
const express = require('express')
const router = express.Router()
// 在这里挂载对应的路由
router.get('/get', (req, res) => {
// 通过req.query获取客户端通过查询字符串,发送到服务器的数据
const query = req.query
// 调用res.send()方法,向客户端响应处理的结果
res.send({
status:0,
msg:'GET请求成功!', //状态的描述
data:query //需要响应给客户端的数据
})
})
// 定义POST接口
router.post('/post', (req, res) => {
// 通过req.body获取请求体中包含的url-encoded格式的数据
const body = req.body
// 调用res.send()方法,向客户端响应结果
res.send({
status:0,
msg:'POST请求成功!',
data:body
})
})
module.exports = router
测试接口
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<button id="btnget">GET</button>
<button id="btnpost">POST</button>
<script>
$(function(){
// 1.测试get接口
$('#btnget').on('click', function(){
$.ajax({
type:'GET',
url:'http://127.0.0.1/api/get',
data:{
name:'zs',
age:20
},
})
})
// 2.测试post接口
$('#btnpost').on('click', function(){
$.ajax({
type:'POST',
url:'http://127.0.0.1/api/post',
data:{
bookname:'水浒传',
author:'施耐庵'
},
})
})
})
</script>
</body>
</html>
总结
以上记录了我学过的一些nodejs内容,都只是一些基础的东西。主要是在黑马程序员的node基础教程里学到的。后续会再记录一下node项目的结构。