目录
目录
6.2.2 监听get请求 监听post请求 把内容响应给客户端
6.2.2 监听get请求 监听post请求 把内容响应给客户端
一.使用node.js运行js代码
使用到了powershell窗口打开终端,由于window10自带powershell,故这里放一个链接方便shift+右击打开。windows10开启shift+右键在此处打开命令窗口 - 知乎 (zhihu.com)
这里放一些终端中的快捷操作:
二.fs文件模块
2.1 读取文件内容
//1.导入fs模块
const fs = require('fs')
//2.调用fs.readFile()方法读取文件
fs.readFile('./files/1.txt','utf8',function(err,dataStr){
console.log(err)
console.log('-----------------------')
console.log(dataStr)
if(err)
{
console.log('文件读取失败'+err.message)
}
else
{
console.log('文件读取成功'+dataStr)
}
})
2.2 fs写入文件内容
const fs = require('fs')
fs.writeFile('./files/12.txt','现在我好伤心',function(err){
//如果文件写入出成功,则err为空
console.log(err)
if(err)
{
console.log('fail'+err.message)
}
else
{
console.log('success')
}
})
2.3 fs读取写入文件的案例
const fs=require('fs')
fs.readFile('./files/1.txt','utf8',function(err,dataStr){
if(err){
console.log('文件读取失败'+err.message)
}
else{
console.log('文件读取成功'+dataStr)
}
//把成绩的数据按照空格进行分割
const arrOld=dataStr.split(' ')//拆分字符串 通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)
console.log(arrOld)
const arrNew=[]
arrOld.forEach(item =>{
arrNew.push(item.replace('=',':'))
})
console.log(arrNew)
const newStr=arrNew.join('\r\n')//回车换行
console.log(newStr)
fs.writeFile('./files/1.txt',newStr,function(err){
if(err){
console.log('文件写入失败'+err.message)
}
else{
console.log('文件写入成功')
}
})
})
2.4 fs模块路径动态拼接
const fs=require('fs')
//这里路径要用\\双斜线
fs.readFile('D:\\福建工程学院\\--------------------------前端学习代码\\前端学习\\code\\06_nodejs\\files\\1.txt','utf8',function(err,dataStr){
if(err)
{
return console.log('fail'+err.message)
}
else{
return console.log('successs\n',dataStr)
}
})
三.path路径模块
3.1 路径拼接
path.join()可以把多个路径片段拼接为完整的路径字符串
格式:path.join([...paths]) ../会抵消路径
//导入path模块
const path=require('path')
const fs=require('fs')
//路径拼接 一个../会把前面的一个路径抵消掉
const pathStr= path.join('/a','/b','../','/c/d')
console.log(pathStr) //输出\a\c\d
//__dirname 总是指向被执行 js 文件的绝对路径
fs.readFile(path.join(__dirname,'./files/1.txt'),'utf8',function(err,dataStr)
{
if(err)
{
console.log('error'+err.message)
}
else{
console.log('success\r\n'+dataStr)
}
})
3.2获取路径中的文件名
//导入path模块
const path = require('path')
//定义文件的存放路径
const fpath='/a/b/c/index.html'
//获取文件名
const fullname=path.basename(fpath)
console.log(fullname)
//除去拓展名
const nameWithoutExt = path.basename(fpath, '.html')
console.log(nameWithoutExt)
3.3 获取路径中的文件扩展名
const path=require('path')
//这是文件的存放路径
const fpath='/a/b/c/index.html'
//获取路径的拓展名
const fnext = path.extname(fpath)
console.log(fnext)
四.http模块
node.js里面的http模块是官方提供的用来创建web服务器的模块。
4.1 创建基本的web服务器
//导入http模块
const http=require('http')
//创建web服务器实例
const sever=http.createServer()
//为服务器实例绑定request事件,监听客户端的请求
// sever.on('request',(function(req,res){
// console.log('有人正在访问服务器')
// })
//req请求对象
// sever.on('request',(req) =>{
// //req.url 是客户端请求的URL地址
// const url=req.url
// //req.method是客户端请求的method请求
// const method=req.method
// console.log('url:'+url+' method:'+method)
// })
//res响应对象
sever.on('request',(req,res)=>{
console.log('有人正在访问服务器')
//req.url 是客户端请求的URL地址
const url=req.url
//req.method是客户端请求的method请求
const method=req.method
//解决中文乱码
res.setHeader('Content-Type','text/html; charset=utf-8')
//调用res.end()方法,向客户端相应一些内容
res.end('hahhahahhahahha哈哈哈哈哈哈哈哈哈哈哈')
})
//启动服务器
sever.listen(8080,function(){
console.log('sever runing at http://127.0.0.1:8080')
})
4.2 根据不同的url相应不同的html内容
const http = require('http')
const server=http.createServer()//创建服务器
server.on('request',(req,res)=>{
const url =req.url //获取请求的url地址
let content = '404 not found!'
if(url === '/' || url ==='/index.html'){
content ='<h1>首页</h1>'
}else if(url ==='/about.html'){
content='<h1>关于页面</h1>'
}
//解决中文乱码
res.setHeader('Content-Type','text/html; charset=utf-8')
//调用res.end()方法,向客户端相应一些内容
res.end('试一试'+content)
})
server.listen(80,()=>{
console.log('sever running at http://127.0.0.1')//服务器启动监听
})
五.模块化
5.1 分类
- 内置模块:由Node.js官方提供,如fs,path,http等
- 自定义模块:用户创建的每个.js文件
- 第三方模块:由第三方开发出来的模块,不是前面两种,使用前需要先下载
5.2 加载模块
require()加载
方法类似如
内置模块const fs = require('fs') 自定义模块const custom = require('./custom.js') ./custom.js是路径 会执行custom.js里面的代码
5.3 模块作用域
定义:在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制叫做模块作用域
5.4 向外共享模块作用域中的成员
module对象:在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息
module.exports对象:在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用。 在默认情况下,module.exports ={ }
5.5 exports对象
exports和module.exports指向同一个对象,最终共享的结果还是以module.exports指向的对象为准。 使用require()模块时得到的永远是module.exports指向的对象。
六.express
6.1 express是什么
express的作用和Node.js内置的http模块类似,是专门用来创建Web服务器的。本质是一个npm包。
安装 在项目所处目录中运行终端命令 npm i express@4.17.1 指定版本号 即可将express安装到项目中使用
6.2 express的基本使用
6.2.1 创建基本的web服务器
//导入express
const express=require('express')
//创建web服务器
const app=express()
//调用app.listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('express sever running at http://127.0.0.1')
})
6.2.2 监听get请求 监听post请求 把内容响应给客户端
app.get()方法 可以监听客户端的get请求
app.post()方法 可以监听客户端的post请求
res.send 把内容响应给客户端
//导入express
const express=require('express')
//创建web服务器
const app=express()
//监听客户端的get和post请求,并向客户端响应具体的内容
//req 请求对象 res 响应对象 /user接口地址
//GET请求一般用去请求获取数据,
app.get('/user',(req,res)=>{
res.send({name:'zs',age:20,gender:'男'})
})
//POST一般作为发送数据到后台时使用
app.post('/user',(req,res)=>{
//调用express 提供的res.send()方法,向客户端响应一个文本字符串
res.send('请求成功')
})
//调用app.listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('express sever running at http://127.0.0.1')
6.2.3 获取url中携带的查询参数
//获取url中携带的查询参数
app.get('/',(req,res)=>{
//通过req.query可以获取到客户端发送过来的 查询参数
//在默认情况下,req.query是一个空对象
console.log(req.query)
res.send(req.query)
})
6.2.4 获取url中的动态参数
//获取url中的动态参数 客户端传的数是多少输出就是多少
//http://127.0.0.1/user/1
app.get('/user/:id',(req,res)=>{
//req.params默认是一个空对象
//里面存放着通过 : 动态匹配到的参数
console.log(req.params)
res.send(req.params)
})
//多个动态参数
//获取url中的动态参数 传的数是多少输出就是多少
//http://127.0.0.1/user/2/djl
app.get('/user/:id/:name',(req,res)=>{
//req.params默认是一个空对象
//里面存放着通过 : 动态匹配到的参数
console.log(req.params)
res.send(req.params)
})
6.3 托管静态资源
express.static()
express在指定的静态目录下查找文件,并对外提供资源的访问路径。因此,存放静态文件的目录名不会出现在URL中。 app.use(express.static(' 指定目录'))
6.4 nodemon
使用nodemon可以监听项目文件的变动,当代码被修改后,nodemon会自动重启项目避免了频繁开关项目
安装:win+R打开终端 输入
node install -g nodemon
使用:nodemon +项目 即 node app.js 更改为 nodemon app.js
6.5 express路由
在express中,路由指的是客户端的请求与服务器处理函数之间的映射关系。
- 路由:由请求的类型、请求的URL地址、处理函数三部分组成
- 格式:app.method(path,handler)
- 路由匹配的注意点:
- 按照定义的先后顺序进行匹配
- 请求类型和请求的URL同时匹配成功才会调用对应的处理函数
6.5.1 模块化路由
将路由抽离为单独的模块。
将路由抽离为单独模块的步骤如下:
- 创建路由模块对应的.js文件
- 调用express.Router()函数创建路由对象
- 向路由对象上挂载具体的路由
- 使用module.exports向外共享路由对象
- 使用app.use()函数注册路由模块
单独模块代码
//导入express
const express =require('express')
//创建路由对象
const router =express.Router()
//挂载具体的路由
router.get('/user/list',(req,res)=>{
res.send('Get user list.')
})
router.post('/user/add',(req,res)=>{
res.send('Add new user.')
})
//向外导出路由对象
module.exports = router
引用模块代码
//导入express
const express=require('express')
//创建路由对象
const app=express()
//导入路由模块
const router=require('./16.router')
//注册路由模块 app.use()的作用是用来注册中间件
app.use(router)
app.listen(80,()=>{
console.log('http://127.0.0.1')
})