这篇文章主要介绍“Node.js的基础知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js的基础知识点有哪些”文章能帮助大家解决问题。 Node.js
是一个调用内置ApI
并且基于Chrome V8
引擎的js运行环境,之前自己在本地总结了一些零散的只知识点,今天整合一下发出来。①基于 Express
框架,可以快速构建 Web 应用。②基于 Electron
框架,可以构建跨平台的桌面应用③基于restify
框架,可以快速构建 API 接口项目④读写和操作数据库
、创建实用的命令行工具辅助前端开发、etc…LTS:长期稳定版Current:尝鲜版查看版本号
:node –v学习路线:JavaScript 基础语法 + Node.js 内置 API 模块(fs、path、http等)+ 第三方 API 模块(express、mysql 等)命令
:node js文件名终端快捷键:①使用 ↑ 键,可以快速定位到上一次执行的命令②使用 tab 键,能够快速补全路径③使用 esc 键,能够快速清空当前已输入的命令④输入 cls 命令,可以清空终端定义:把复杂问题简单化,分成一个个小问题。编程领域中的模块化
,就是遵守固定的规则
,把一个大文件拆成独立并互相依赖
的多个小模块
把代码进行模块化拆分的好处:提高了代码的复用性提高了代码的可维护性可以实现按需加载定义:由Node.js官方提供,如fs、http、path
//引用内部模块 constfs=require('fs'); //文件读取 fs.readFile('../files/test-fs.txt','utf-8',(err,results)=>{ if(err)returnconsole.log(err.message);//错误信息errnull console.log(results); }) //文件写入 fs.writeFile('../files/test-fs.txt','Node.js','utf-8',(err)=>{ if(err)returnconsole.log(err.message); console.log('写入文件成功!'); })
注意点readFile
只能读取已经存在的文件writeFile
写入内容已经有文件,则创建同名文件,再写入文件readFile
需要在writeFile
后面读取,不然出错node
命令自动将当前路径和js脚本文件路径
拼接,而不管.day总复习这个路径
我们可以使用绝对路径
改善./
表示当前目录 ../
表示父级目录../..
表示祖父目录动态拼接,首部不能出现./ ../
,否则拼接失败 /…/定义:拼接绝对路径
path.join()path.basename()path.extname()
constfs=require('fs'); constpath=require('path'); constfpath=path.join(__dirname,'/../files/test-fs.txt'); fs.readFile(fpath,'utf-8',(err,results)=>{ console.log(__dirname); console.log(path.basename(fpath,'.txt')); console.log(path.extname(fpath)); if(err)returnconsole.log(err.message); console.log(results); }) //test-fs //.txt //Node.js
定义:Node.js
提供创建web服务器
//导入http模块 consthttp=require('http'); //创建web服务器实例 constserver=http.createServer(); //绑定request事件,监听客户端请求 server.on('request',(req,res)=>{ letstr=`路径${req.url}方法${req.method}`; console.log(str); //向客户端发送中文前,设置响应头 res.setHeader('Content-Type','text/html;charset=utf-8'); res.end(str); }) //启动服务器 server.listen(80,()=>{ console.log('http://127.0.0.1'); })
根据浏览器访问的url地址
不同,返回相应的绝对路径
constfs=require('fs'); consthttp=require('http'); constpath=require('path'); constserver=http.createServer(); letfpath=''; server.on('request',(req,res)=>{ if(req.url==='/'){ fpath=path.join(__dirname+'/../files/clock/index.html'); console.log(__dirname); console.log(fpath); } else{ fpath=path.join(__dirname+'/../files/clock'+req.url); } fs.readFile(fpath,'utf-8',(err,results)=>{ if(err)res.end('404notfind'); res.end(results); }) }) server.listen(80,()=>{ console.log('http://127.0.0.1'); })
定义:用户自定义的js模块
//引入本地文件 constcustom=require('./01-node.js的使用');
注意:自定义模块开头必须有./ …/定义:由第三方
提供,使用前需要下载
//下载外部导入 constmoment=require('moment');
npminodemon-g
代替node
使用nodedmon
,每次修改内容不需要重启服务器,自动监听模块作用域定义
:和函数一致,当前模块定义的方法、变量,只能在当前模块
访问,防止变量污染
暴露
:通过module.exports
或者exports
暴露出去,使用 require()
方法导入模块时,导入的结果,永远以module.exports
指向的对象为准定义: 一次加载缓存,从缓存加载
,内置模块
加载优先级MAX包:概念像node.js
的第三方模块
,包是基于内置模块
封装出来的,提供了更高级、更方便的 API
,极大的提高了开发效率
npm: 包管理工具npm安装包
js导入包
根据开发文档使用包
//npmimoment constmoment=require('moment'); constdate=moment().format('YYYY-MM-DDHH:mm:ss'); console.log(date);//2022-09-1010:43:24
包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如 2.24.0
其中每一位数字所代表的的含义如下:第1位数字:大版本
第2位数字:功能版本
第3位数字:Bug修复版本
版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零。
npmicomment@2.22.2
node_modules
文件夹用来存放所有已安装到项目中的包。require() 导入第三方包时,就是从这个目录中查找并加载包。package-lock.json
配置文件用来记录 node_modules 目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。package.json
项目的名称、版本号、描述等、用到了哪些包、开发期间使用的包、部署使用的包devDependencies
:开发依赖dependencies
:核心依赖注意:程序员不要手动修改 node_modules 或 package-lock.json 文件中的任何代码,npm 包管理工具会自动维护它们,今后在项目开发中,一定要把 node_modules 文件夹,添加到 .gitignore 忽略文件中
//安装包 npmimoment //安装全局包 npmi包名-g //安装包到开发阶段到devDependencies npmi包名-D //安装所有依赖包 npminstall //卸载包 npmuninstallmoment //查看已经安装的局部包 npmls //查看全局安装的包 npmls-g
//查看当前npm镜像 npmconfiggetregistry //nrm镜像工具,安装为全局镜像 nrmls //切换镜像 nrmusetaobao
一个规范的包,它的组成结构,必须符合以下 3 点要求:包必须以单独的目录
而存在包的顶级目录下要必须包含 package.json
这个包管理配置文件package.json 中必须包含 name,version,main
这三个属性,分别代表包的名字、版本号、包的入口
发布包到npm
上镜像切换到npm上npm login
登录发布包 npm publish
删除包 npm unpublish 包名 --force
四、ExpressExpress
:基于Node.js http
进一步封装,更加高级的Web开发框架对于前端程序员来说,最常见的两种服务器,分别是:Web 网站服务器:专门对外提供 Web 网页资源
的服务器API 接口服务器:专门对外提供 API 接口
的服务器
//导入包 constexpress=require('express'); //创建服务器 constapp=express(); app.get('/user',(req,res)=>{ res.send({男:'18',age:28}); }) app.post('/user',(req,res)=>{ res.send('post请求'); }) app.get('/',(req,res)=>{ //req.query?name=zs&age=18这种数据 //http://127.0.0.1?name=zs&age=18 console.log(req.query); }) app.post('/:id',(req,res)=>{ //动态匹配参数 console.log(req.params); }) //启动服务器 app.listen(80,()=>{ console.log('http://127.0.0.1'); })
定义
:通过路径暴露文件,省去文件路径的描写
constexpress=require('express'); constapp=express(); //托管静态资源,不需要访问 app.use('/public',express.static('../files/clock')); app.listen(80,()=>{ console.log('http://127.0.0.1'); })
定义
:客户端与服务器映射关系
//导入包 constexpress=require('express'); //创建服务器 constapp=express(); app.get('/user',(req,res)=>{ res.send({男:'18',age:28}); }) app.post('/user',(req,res)=>{ res.send('post请求'); }) //启动服务器 app.listen(80,()=>{ console.log('http://127.0.0.1'); })
为了方便对路由进行模块化的管理
,Express 不建议将路由直接挂载到 app 上,而是推荐将路由抽离为单独的模块
。将路由抽离为单独模块的步骤
如下:创建路由模块
对应的 .js
文件调用express.Router()
函数创建路由对象向路由对象上挂载具体的路由使用 module.exports
向外共享路由对象使用app.use()
函数注册路由模块创建路由对象
constexpress=require('express');//导入包 constrouter=express.Router();//创建路由对象 //绑定路由规则 router.get('/user/list',(req,res)=>{ res.send('userlistmessage'); }) router.post('/user/add',(req,res)=>{ res.send('useraddmessage'); }) //向外导出路由对象 module.exports=router;
使用路由对象
constexpress=require('express'); constapp=express(); constrouter=require('./11-模块化路由'); app.use(router); app.listen(80,()=>{ console.log('http://127.0.0.1'); })
中间件:与路由处理函数不同,必须包含next参数
constexpress=require('express'); constapp=express(); //全局中间件的简化形式 app.use((req,res,next)=>{ console.log('正在使用全局中间件'); next(); }); app.get('/',(req,res)=>{ res.send('Getmessage'); }) app.listen(80,()=>{ console.log('http://127.0.0.1'); })
注意多个中间件共享req,res
,上游设置好,下游的中间件/路由使用中间件
定义先后顺序执行局部生效
的中间件,定义在
路由之前
调用中间件next()函数
不能忘,后面不用写内容
constexpress=require('express'); constapp=express(); //全局中间件 app.use((req,res,next)=>{ console.log('全局中间件'); next(); }) //局部中间件 functionmw(req,res,next){ console.log('局部中间件'); next(); } app.get('/',mw,(req,res)=>{ res.send('serverisvisting'); }) app.listen(80,()=>{ console.log('http://127.0.0.1'); })
定义:绑定到 express.Router()
实例上的中间件定义:捕获项目
错误,防止出错,在所有路由之后
定义
constexpress=require('express'); constapp=express(); app.get('/',(req,res)=>{ thrownewError('服务器出错'); res.send('serverisvisting'); }) //全局中间件 app.use((err,req,res,next)=>{ console.log('Error!'+err.message); res.send('Error!'+err.message); next(); }) app.listen(80,()=>{ console.log('http://127.0.0.1'); }) //Error!服务器出错
constexpress=require('express'); constapp=express(); //express.json()解析JSON请求体 app.use(express.json()); //解析application/x-www- app.use(express.urlencoded({extended:false})); app.post('/user',(req,res)=>{ console.log(req.body); }) app.post('/book',(req,res)=>{ console.log(req.body); }) app.listen(80,()=>{ console.log('http://127.0.0.1'); }) //http://127.0.0.1 //{name:'zs',age:18} //[Object:nullprototype]{name:'西游记'}
npm install body-parse
require
导入app.use()
为全局
constexpress=require('express'); constapp=express(); constparser=require('body-parser'); app.use(parser.urlencoded({extended:false})); app.post('/book',(req,res)=>{ console.log(req.body); }) app.listen(80,()=>{ console.log('http://127.0.0.1'); })
注意:Express 内置的 express.urlencoded
中间件,就是基于 body-parser
这个第三方中间件进一步封装出来的。封装中间件
constquerystring=require('querystring'); functionparsebody(req,res,next){ letstr=''; req.on('data',(result)=>{ str+=result; }) req.on('end',()=>{ constbody=querystring.parse(str); req.body=body; next(); }) } module.exports=parsebody;
测试中间件
constexpress=require('express'); constapp=express(); constparsebody=require('./14-自定义中间件'); app.use(parsebody); app.post('/user',(req,res)=>{ res.send(req.body); console.log(req.body); }) app.listen(80,()=>{ console.log('http://127.0.0.1'); })
constexpress=require('express'); constapp=express(); constrouter=require('./15-接口问题'); app.use(router); app.listen(80,()=>{ console.log('http://127.0.0.1'); })
constexpress=require('express'); constapiRouter=express.Router(); apiRouter.get('/user',(req,res)=>{ constquery=req.query; res.send({ status:0, msg:'GET请求成功', data:query }); }) module.exports=apiRouter;
apiRouter.use(express.urlencoded({extended:false})); apiRouter.post('/user',(req,res)=>{ constbody=req.body; res.send({ status:0, msg:'POST请求成功', data:body }); })
概念:由Http
响应头构成,决定浏览器
是否阻止js代码
获取资源,在服务器端
配置
//只允许特定的域名访问、*代表全部 res.setHeader('Access-Control-Allow-Origin','http://www.baidu.com'); //配置请求头信息 res.setHeader('Access-Control-Allow-Headers','Content-Type,X-Custom-Header'); //配置请求头方法*代表全部 res.setHeader('Access-Control-Allow-Methods','GET,POST,DELETE,PUT');
请求方式:GET、POST、HEADHTTP 头部信息不超过以下几种字段:无自定义头部字段
、Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width 、Content-Type(只有三个值application/x-www-form-urlencoded免费云主机、域名、multipart/form-data、text/plain)客户端与服务器只发送一次请求
请求方式:GET、POST、HEAD之外的方式自定义
头部字段OPTION预检
,成功后发送带有数据的请求概念:只支持GET
请求定义:组织
、存储
、管理数据
的仓库
select*fromuserswhereid>1andid
insertintousers(username,password)values('jack','666')
updateuserssetpassword='666666'whereusername='jack'
deletefromusers whereid=9
导包:npm i mysql
//引入mysql constmysql=require('mysql'); //建立数据库连接 constdb=mysql.createPool({ url:'127.0.0.1',//数据库IP地址 user:'root',//账号 password:'123456',//密码 database:'test_db'//操作哪一个数据库 });
constqueryStr='select*fromusers'; db.query(queryStr,(err,results)=>{ if(err)returnconsole.log(err.message); console.log(results); }) PSE:FEDjsnode.jsnode.js—资料day总复习code>node.18-mysql操作.js [ RowDataPacket{id:1,username:'zz',password:'123',status:0}, RowDataPacket{id:2,username:'ls',password:'abc',status:0}, RowDataPacket{id:4,username:'jony',password:'456',status:0} ]
constuser={username:'superman',password:'jknad'}; constinsertStr='insertintousersset?'; db.query(insertStr,user,(err,results)=>{ if(err)returnconsole.log(err.message); if(results.affectedRows==1){ console.log('插入数据成功'); } }) //插入数据成功
constuser={id:10,username:'super',password:'123456'}; constupdateStr='updateusersset?whereid=?'; db.query(updateStr,[user,user.id],(err,results)=>{ if(err)returnconsole.log(err.message); if(results.affectedRows==1){ console.log('更新数据成功'); } })
constdeleteStr='deletefromuserswhereid=?'; db.query(deleteStr,10,(err,results)=>{ if(err)returnconsole.log(err.message); if(results.affectedRows==1){ console.log('删除成功'); } })
constdeleteStr='updateuserssetstatus=1whereid=?'; db.query(deleteStr,10,(err,results)=>{ if(err)returnconsole.log(err.message); if(results.affectedRows==1){ console.log('删除成功'); } })
概念:服务端在后台拼接html页面
,发送给客户端,不需要ajax
特点:前端耗时少有利于SEO占用服务端资源不利于前后端分离开发概念:后端提供API
接口,前端通过ajax
调用接口特点:开发体验好用户体验好减轻服务器渲染压力不利于SEO不谈业务场景而盲目选择使用何种开发模式都是耍流氓比如企业级网站
,主要功能是展示而没有复杂的交互,并且需要良好的 SEO
,则这时我们就需要使用服务器端渲染
而类似后台管理项目
,交互性
比较强,不需要考虑 SEO
,那么就可以使用前后端分离
的开发模式另外,具体使用何种开发模式并不是绝对的,为了同时兼顾了首页的渲染速度和前后端分离的开发效率,一些网站采用了首屏服务器端渲染 + 其他页面前后端分离
的开发模式概念:通过不同的手段(验证码、密码、人脸、指纹...
),认证客户的身份Cookie:存储在浏览器不超过4KB
字符串,键值对
形式存储自动发送域名独立过期时限4KB限制容易伪造,不建议存放隐私数据
核心:会员卡+pos机认证
npm install express-session
关于“Node.js的基础知识点有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注云技术行业资讯频道,小编每天都会为大家更新不同的知识点。
相关推荐: jquery touch事件注册不了的问题怎么解决
今天小编给大家分享一下jquery touch事件注册不了的问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 随着移动互联网的发展,越…