本篇文章透過超多程式碼和圖解來帶大家深入解析Node.js,主要內容包括模組化處理、套件的基本應用、Express、跨域、操作Mysql資料庫等,希望對大家有幫助!
Node.js
是一個呼叫內建#ApI
並且基於Chrome V8
引擎的js運行環境,之前自己在本地總結了一些零散的只知識點,今天整合一下發出來。
官網位址: https://nodejs.org/zh-cn/
①是基於Express
框架(http://www.expressjs.com.cn/),可以快速建立Web 應用。 【相關教學推薦:nodejs影片教學、程式設計教學】
#②基於 Electron
框架(https://electronjs.org/) ,可以建立跨平台的桌面應用程式
③基於restify
框架(http://restify.com/),可以快速建立API 介面項目
④讀寫和操作資料庫
、建立實用的命令列工具輔助前端開發、etc…
下載連結:https://nodejs.org/en/
- #LTS:長期穩定版
- Current:嚐鮮版
看版本號
:node –v
學習路線:JavaScript 基礎語法Node.js 內建API 模組(fs、path、http等) 第三方API 模組(express、mysql 等)
一文帶你深入了解Node.js(圖文詳解).4 Node.js的使用 指令②使用tab 鍵,能夠快速補全路徑
③使用esc 鍵,能夠快速清空目前已輸入的命令④輸入cls 指令,可以清空終端機二、模組化處理
一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 什麼是模組化
- # 定義
- :把複雜問題簡化,分成個小問題。程式設計領域中的 模組化
把程式碼進行模組化分割的好處:
#提高了程式碼的複用性提高了程式碼的可維護性可以實作按需載入
#一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 內建模組
- :由Node.js官方提供,如
fs、http、path
-
(一文帶你深入了解Node.js(圖文詳解))基本用法
// 引用内部模块 const fs = require(&#一文帶你深入了解Node.js(圖文詳解)9;fs&#一文帶你深入了解Node.js(圖文詳解)9;); // 文件读取 fs.readFile(&#一文帶你深入了解Node.js(圖文詳解)9;../files/test-fs.txt&#一文帶你深入了解Node.js(圖文詳解)9;, &#一文帶你深入了解Node.js(圖文詳解)9;utf-8&#一文帶你深入了解Node.js(圖文詳解)9;, (err, results) => { if (err) return console.log(err.message);// 错误信息err null console.log(results); }) // 文件写入 fs.writeFile(&#一文帶你深入了解Node.js(圖文詳解)9;../files/test-fs.txt&#一文帶你深入了解Node.js(圖文詳解)9;, &#一文帶你深入了解Node.js(圖文詳解)9;Node.js&#一文帶你深入了解Node.js(圖文詳解)9;, &#一文帶你深入了解Node.js(圖文詳解)9;utf-8&#一文帶你深入了解Node.js(圖文詳解)9;, (err) => { if (err) return console.log(err.message); console.log(&#一文帶你深入了解Node.js(圖文詳解)9;写入文件成功!&#一文帶你深入了解Node.js(圖文詳解)9;); })
注意點
#readFile
-
writeFile
寫入內容已經有文件,則建立同名文件,再寫入文件readFile
需要在 writeFile - 後面讀取,不然出錯
(一文帶你深入了解Node.js(圖文詳解))防止動態拼接
- node
- 指令會自動將目前路徑和
js腳本檔路徑
拼接,而不管.\day總複習這個路徑
##我們可以使用
絕對路徑 改善 -
(一文帶你深入了解Node.js(圖文詳解))路徑問題./
表示目前目錄../ 表示父級目錄../..表示祖父目錄
- path.join()
- path.basename()
- path.extname()
const fs = require(&#一文帶你深入了解Node.js(圖文詳解)9;fs&#一文帶你深入了解Node.js(圖文詳解)9;); const path = require(&#一文帶你深入了解Node.js(圖文詳解)9;path&#一文帶你深入了解Node.js(圖文詳解)9;); const fpath = path.join(__dirname, &#一文帶你深入了解Node.js(圖文詳解)9;/../files/test-fs.txt&#一文帶你深入了解Node.js(圖文詳解)9;); fs.readFile(fpath, &#一文帶你深入了解Node.js(圖文詳解)9;utf-8&#一文帶你深入了解Node.js(圖文詳解)9;, (err, results) => { console.log(__dirname); console.log(path.basename(fpath, &#一文帶你深入了解Node.js(圖文詳解)9;.txt&#一文帶你深入了解Node.js(圖文詳解)9;)); console.log(path.extname(fpath)); if (err) return console.log(err.message); console.log(results); }) // test-fs // .txt // Node.js
一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) http内置模块
定义:Node.js
提供创建web服务器
(一文帶你深入了解Node.js(圖文詳解)) 初始化
// 导入http模块 const http = require(&#一文帶你深入了解Node.js(圖文詳解)9;http&#一文帶你深入了解Node.js(圖文詳解)9;); //创建web服务器实例 const server = http.createServer(); //绑定request事件,监听客户端请求 server.on(&#一文帶你深入了解Node.js(圖文詳解)9;request&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { let str = `路径 ${req.url} 方法 ${req.method}`; console.log(str); // 向客户端发送中文前,设置响应头 res.setHeader(&#一文帶你深入了解Node.js(圖文詳解)9;Content-Type&#一文帶你深入了解Node.js(圖文詳解)9;, &#一文帶你深入了解Node.js(圖文詳解)9;text/html;charset=utf-8&#一文帶你深入了解Node.js(圖文詳解)9;); res.end(str); }) //启动服务器 server.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); })
(一文帶你深入了解Node.js(圖文詳解)) web服务器
- 根据浏览器访问的
url地址
不同,返回相应的绝对路径
const fs = require(&#一文帶你深入了解Node.js(圖文詳解)9;fs&#一文帶你深入了解Node.js(圖文詳解)9;); const http = require(&#一文帶你深入了解Node.js(圖文詳解)9;http&#一文帶你深入了解Node.js(圖文詳解)9;); const path = require(&#一文帶你深入了解Node.js(圖文詳解)9;path&#一文帶你深入了解Node.js(圖文詳解)9;); const server = http.createServer(); let fpath = &#一文帶你深入了解Node.js(圖文詳解)9;&#一文帶你深入了解Node.js(圖文詳解)9;; server.on(&#一文帶你深入了解Node.js(圖文詳解)9;request&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { if (req.url === &#一文帶你深入了解Node.js(圖文詳解)9;/&#一文帶你深入了解Node.js(圖文詳解)9;) { fpath = path.join(__dirname + &#一文帶你深入了解Node.js(圖文詳解)9;/../files/clock/index.html&#一文帶你深入了解Node.js(圖文詳解)9;); console.log(__dirname); console.log(fpath); } else { fpath = path.join(__dirname + &#一文帶你深入了解Node.js(圖文詳解)9;/../files/clock&#一文帶你深入了解Node.js(圖文詳解)9; + req.url); } fs.readFile(fpath, &#一文帶你深入了解Node.js(圖文詳解)9;utf-8&#一文帶你深入了解Node.js(圖文詳解)9;, (err, results) => { if (err) res.end(&#一文帶你深入了解Node.js(圖文詳解)9;404 not find&#一文帶你深入了解Node.js(圖文詳解)9;); res.end(results); }) }) server.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); })
定义:用户自定义的js模块
//引入本地文件 const custom = require(&#一文帶你深入了解Node.js(圖文詳解)9;./0一文帶你深入了解Node.js(圖文詳解)-node.js的使用&#一文帶你深入了解Node.js(圖文詳解)9;);
注意:自定义模块开头必须有./ …/
定义:由第三方
提供,使用前需要下载
//下载外部导入 const moment = require(&#一文帶你深入了解Node.js(圖文詳解)9;moment&#一文帶你深入了解Node.js(圖文詳解)9;);
监听nodemon
npm i nodemon -g
代替node
使用nodedmon
,每次修改内容不需要重启服务器,自动监听
模块作用域定义
:和函数一致,当前模块定义的方法、变量,只能在当前模块
访问,防止变量污染
暴露
:通过module.exports
或者exports
暴露出去,使用 require()
方法导入模块时,导入的结果,永远以module.exports
指向的对象为准
定义: 一次加载缓存,从缓存加载
,内置模块
加载优先级MAX
包:概念像node.js
的第三方模块
,包是基于内置模块
封装出来的,提供了更高级、更方便的 API
,极大的提高了开发效率
npm: 包管理工具
-
npm
安装包
-
js
导入包
- 根据开发文档
使用包
// npm i moment const moment = require(&#一文帶你深入了解Node.js(圖文詳解)9;moment&#一文帶你深入了解Node.js(圖文詳解)9;); const date = moment().format(&#一文帶你深入了解Node.js(圖文詳解)9;YYYY-MM-DD HH:mm:ss&#一文帶你深入了解Node.js(圖文詳解)9;); console.log(date);//一文帶你深入了解Node.js(圖文詳解)0一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)-09-一文帶你深入了解Node.js(圖文詳解)0 一文帶你深入了解Node.js(圖文詳解)0:4一文帶你深入了解Node.js(圖文詳解):一文帶你深入了解Node.js(圖文詳解)4
包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如 一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解)4.0
其中每一位数字所代表的的含义如下:
第一文帶你深入了解Node.js(圖文詳解)位数字:
大版本
第一文帶你深入了解Node.js(圖文詳解)位数字:
功能版本
-
第一文帶你深入了解Node.js(圖文詳解)位数字:
Bug修复版本
版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零。
npm i comment@一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解)
-
node_modules
文件夹用来存放所有已安装到项目中的包。require() 导入第三方包时,就是从这个目录中查找并加载包。 -
package-lock.json
配置文件用来记录 node_modules 目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。 -
package.json
项目的名称、版本号、描述等、用到了哪些包、开发期间使用的包、部署使用的包-
devDependencies
:开发依赖 -
dependencies
:核心依赖
-
- 注意:程序员不要手动修改 node_modules 或 package-lock.json 文件中的任何代码,npm 包管理工具会自动维护它们,今后在项目开发中,一定要把 node_modules 文件夹,添加到 .gitignore 忽略文件中
//安装包 npm i moment //安装全局包 npm i 包名 -g //安装包到开发阶段到devDependencies npm i 包名 -D //安装所有依赖包 npm install //卸载包 npm uninstall moment //查看已经安装的局部包 npm ls //查看全局安装的包 npm ls -g
查看包命令:https://blog.csdn.net/qq_4一文帶你深入了解Node.js(圖文詳解)664096/article/details/一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)797一文帶你深入了解Node.js(圖文詳解)60
//查看当前npm镜像 npm config get registry //nrm镜像工具,安装为全局镜像 nrm ls //切换镜像 nrm use taobao
一个规范的包,它的组成结构,必须符合以下 一文帶你深入了解Node.js(圖文詳解) 点要求:
- 包必须以
单独的目录
而存在 - 包的顶级目录下要必须包含
package.json
这个包管理配置文件 - package.json 中必须包含
name,version,main
这三个属性,分别代表包的名字、版本号、包的入口
发布包到npm
上
- 镜像切换到npm上
-
npm login
登录 - 发布包
npm publish
- 删除包
npm unpublish 包名 --force
资源:
- https://www.npmjs.com/ 网站上搜索自己所需要的包
- https://registry.npmjs.org/ 服务器上下载自己需要的包
Express
:基于Node.js http
进一步封装,更加高级的Web开发框架
对于前端程序员来说,最常见的两种服务器,分别是:
-
Web 网站服务器:专门对外提供
Web 网页资源
的服务器 -
API 接口服务器:专门对外提供
API 接口
的服务器
//导入包 const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); //创建服务器 const app = express(); app.get(&#一文帶你深入了解Node.js(圖文詳解)9;/user&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { res.send({ 男: &#一文帶你深入了解Node.js(圖文詳解)9;一文帶你深入了解Node.js(圖文詳解)8&#一文帶你深入了解Node.js(圖文詳解)9;, age: 一文帶你深入了解Node.js(圖文詳解)8 }); }) app.post(&#一文帶你深入了解Node.js(圖文詳解)9;/user&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { res.send(&#一文帶你深入了解Node.js(圖文詳解)9;post请求&#一文帶你深入了解Node.js(圖文詳解)9;); }) app.get(&#一文帶你深入了解Node.js(圖文詳解)9;/&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { //req.query ?name=zs&age=一文帶你深入了解Node.js(圖文詳解)8 这种数据 //http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)?name=zs&age=一文帶你深入了解Node.js(圖文詳解)8 console.log(req.query); }) app.post(&#一文帶你深入了解Node.js(圖文詳解)9;/:id&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { //动态匹配参数 console.log(req.params); }) //启动服务器 app.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); })
定义
:通过路径暴露文件,省去文件路径的描写
const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); const app = express(); //托管静态资源,不需要访问 app.use(&#一文帶你深入了解Node.js(圖文詳解)9;/public&#一文帶你深入了解Node.js(圖文詳解)9;, express.static(&#一文帶你深入了解Node.js(圖文詳解)9;../files/clock&#一文帶你深入了解Node.js(圖文詳解)9;)); app.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); })
推荐VScode插件:postcode
Express 的中文官网: http://www.expressjs.com.cn/
定义
:客户端与服务器映射关系
4.4.一文帶你深入了解Node.js(圖文詳解) 简单挂载
//导入包 const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); //创建服务器 const app = express(); app.get(&#一文帶你深入了解Node.js(圖文詳解)9;/user&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { res.send({ 男: &#一文帶你深入了解Node.js(圖文詳解)9;一文帶你深入了解Node.js(圖文詳解)8&#一文帶你深入了解Node.js(圖文詳解)9;, age: 一文帶你深入了解Node.js(圖文詳解)8 }); }) app.post(&#一文帶你深入了解Node.js(圖文詳解)9;/user&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { res.send(&#一文帶你深入了解Node.js(圖文詳解)9;post请求&#一文帶你深入了解Node.js(圖文詳解)9;); }) //启动服务器 app.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); })
4.4.一文帶你深入了解Node.js(圖文詳解) 模块化路由
为了方便对路由进行模块化的管理
,Express 不建议将路由直接挂载到 app 上,而是推荐将路由抽离为单独的模块
。
将路由抽离为单独模块的步骤
如下:
创建路由
模块
对应的.js
文件调用
express.Router()
函数创建路由对象向路由对象上挂载具体的路由
使用
module.exports
向外共享路由对象使用
app.use()
函数注册路由模块
创建路由对象
const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;);//导入包 const router = express.Router();//创建路由对象 //绑定路由规则 router.get(&#一文帶你深入了解Node.js(圖文詳解)9;/user/list&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { res.send(&#一文帶你深入了解Node.js(圖文詳解)9;user list message&#一文帶你深入了解Node.js(圖文詳解)9;); }) router.post(&#一文帶你深入了解Node.js(圖文詳解)9;/user/add&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { res.send(&#一文帶你深入了解Node.js(圖文詳解)9;user add message&#一文帶你深入了解Node.js(圖文詳解)9;); }) //向外导出路由对象 module.exports = router;
使用路由对象
const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); const app = express(); const router = require(&#一文帶你深入了解Node.js(圖文詳解)9;./一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)-模块化路由&#一文帶你深入了解Node.js(圖文詳解)9;); app.use(router); app.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); })
中间件:与路由处理函数不同,必须包含next参数
4.5.一文帶你深入了解Node.js(圖文詳解) 基本使用
const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); const app = express(); //全局中间件的简化形式 app.use((req, res, next) => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;正在使用全局中间件&#一文帶你深入了解Node.js(圖文詳解)9;); next(); }); app.get(&#一文帶你深入了解Node.js(圖文詳解)9;/&#一文帶你深入了解Node.js(圖文詳解)9;,(req, res) => { res.send(&#一文帶你深入了解Node.js(圖文詳解)9;Get message&#一文帶你深入了解Node.js(圖文詳解)9;); }) app.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); })
注意
多个中间件共享
req,res
,上游设置好,下游的中间件/路由使用中间件
定义先后顺序执行-
局部生效
的中间件,定义在app.get(&#一文帶你深入了解Node.js(圖文詳解)9;/&#一文帶你深入了解Node.js(圖文詳解)9;,中间件,(req, res) => { res.send(&#一文帶你深入了解Node.js(圖文詳解)9;Get message&#一文帶你深入了解Node.js(圖文詳解)9;); })
路由之前
调用中间件next()函数
不能忘,后面不用写内容
4.5.一文帶你深入了解Node.js(圖文詳解) 中间件分类
(一文帶你深入了解Node.js(圖文詳解))应用
const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); const app = express(); //全局中间件 app.use((req, res, next) => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;全局中间件&#一文帶你深入了解Node.js(圖文詳解)9;); next(); }) //局部中间件 function mw(req, res, next) { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;局部中间件&#一文帶你深入了解Node.js(圖文詳解)9;); next(); } app.get(&#一文帶你深入了解Node.js(圖文詳解)9;/&#一文帶你深入了解Node.js(圖文詳解)9;, mw, (req, res) => { res.send(&#一文帶你深入了解Node.js(圖文詳解)9;server is visting&#一文帶你深入了解Node.js(圖文詳解)9;); }) app.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); })
(一文帶你深入了解Node.js(圖文詳解))路由
定义:绑定到 express.Router()
实例上的中间件
(一文帶你深入了解Node.js(圖文詳解))错误
定义:捕获项目
错误,防止出错,在所有路由之后
定义
const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); const app = express(); app.get(&#一文帶你深入了解Node.js(圖文詳解)9;/&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { throw new Error(&#一文帶你深入了解Node.js(圖文詳解)9;服务器出错&#一文帶你深入了解Node.js(圖文詳解)9;); res.send(&#一文帶你深入了解Node.js(圖文詳解)9;server is visting&#一文帶你深入了解Node.js(圖文詳解)9;); }) //全局中间件 app.use((err, req, res, next) => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;Error!&#一文帶你深入了解Node.js(圖文詳解)9; + err.message); res.send(&#一文帶你深入了解Node.js(圖文詳解)9;Error!&#一文帶你深入了解Node.js(圖文詳解)9; + err.message); next(); }) app.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); }) //Error!服务器出错
(4)Express 内置
const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); const app = express(); // express.json()解析JSON请求体 app.use(express.json()); //解析application/x-www- app.use(express.urlencoded({ extended: false })); app.post(&#一文帶你深入了解Node.js(圖文詳解)9;/user&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { console.log(req.body); }) app.post(&#一文帶你深入了解Node.js(圖文詳解)9;/book&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { console.log(req.body); }) app.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); }) // http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解) // { name: &#一文帶你深入了解Node.js(圖文詳解)9;zs&#一文帶你深入了解Node.js(圖文詳解)9;, age: 一文帶你深入了解Node.js(圖文詳解)8 } // [Object: null prototype] { name: &#一文帶你深入了解Node.js(圖文詳解)9;西游记&#一文帶你深入了解Node.js(圖文詳解)9; }
(5)第三方
npm install body-parse
-
require
导入 -
app.use()
为全局
const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); const app = express(); const parser = require(&#一文帶你深入了解Node.js(圖文詳解)9;body-parser&#一文帶你深入了解Node.js(圖文詳解)9;); app.use(parser.urlencoded({ extended: false })); app.post(&#一文帶你深入了解Node.js(圖文詳解)9;/book&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { console.log(req.body); }) app.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); })
注意:Express 内置的 express.urlencoded
中间件,就是基于 body-parser
这个第三方中间件进一步封装出来的。
封装中间件
const querystring = require(&#一文帶你深入了解Node.js(圖文詳解)9;querystring&#一文帶你深入了解Node.js(圖文詳解)9;); function parsebody(req, res, next) { let str = &#一文帶你深入了解Node.js(圖文詳解)9;&#一文帶你深入了解Node.js(圖文詳解)9;; req.on(&#一文帶你深入了解Node.js(圖文詳解)9;data&#一文帶你深入了解Node.js(圖文詳解)9;, (result) => { str += result; }) req.on(&#一文帶你深入了解Node.js(圖文詳解)9;end&#一文帶你深入了解Node.js(圖文詳解)9;, () => { const body = querystring.parse(str); req.body = body; next(); }) } module.exports = parsebody;
测试中间件
const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); const app = express(); const parsebody = require(&#一文帶你深入了解Node.js(圖文詳解)9;./一文帶你深入了解Node.js(圖文詳解)4-自定义中间件&#一文帶你深入了解Node.js(圖文詳解)9;); app.use(parsebody); app.post(&#一文帶你深入了解Node.js(圖文詳解)9;/user&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { res.send(req.body); console.log(req.body); }) app.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); })
const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); const app = express(); const router = require(&#一文帶你深入了解Node.js(圖文詳解)9;./一文帶你深入了解Node.js(圖文詳解)5-接口问题&#一文帶你深入了解Node.js(圖文詳解)9;); app.use(router); app.listen(80, () => { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;http://一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;); })
4.7.一文帶你深入了解Node.js(圖文詳解) GET接口
const express = require(&#一文帶你深入了解Node.js(圖文詳解)9;express&#一文帶你深入了解Node.js(圖文詳解)9;); const apiRouter = express.Router(); apiRouter.get(&#一文帶你深入了解Node.js(圖文詳解)9;/user&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { const query = req.query; res.send({ status: 0, msg: &#一文帶你深入了解Node.js(圖文詳解)9;GET 请求成功&#一文帶你深入了解Node.js(圖文詳解)9;, data: query }); }) module.exports = apiRouter;
4.7.一文帶你深入了解Node.js(圖文詳解) POST接口
apiRouter.use(express.urlencoded({ extended: false })); apiRouter.post(&#一文帶你深入了解Node.js(圖文詳解)9;/user&#一文帶你深入了解Node.js(圖文詳解)9;, (req, res) => { const body = req.body; res.send({ status: 0, msg: &#一文帶你深入了解Node.js(圖文詳解)9;POST 请求成功&#一文帶你深入了解Node.js(圖文詳解)9;, data: body }); })
4.7.一文帶你深入了解Node.js(圖文詳解) PUT接口
4.7.4 DELETE接口
4.7.5 区别
https://blog.csdn.net/qq_4一文帶你深入了解Node.js(圖文詳解)9一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)85/article/details/一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)985一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)94
https://zhuanlan.zhihu.com/p/一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)5454697
5.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 原理
概念:由Http
响应头构成,决定浏览器
是否阻止js代码
获取资源,在服务器端
配置
5.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 响应头
//只允许特定的域名访问、*代表全部 res.setHeader(&#一文帶你深入了解Node.js(圖文詳解)9;Access-Control-Allow-Origin&#一文帶你深入了解Node.js(圖文詳解)9;, &#一文帶你深入了解Node.js(圖文詳解)9;http://www.baidu.com&#一文帶你深入了解Node.js(圖文詳解)9;); //配置请求头信息 res.setHeader(&#一文帶你深入了解Node.js(圖文詳解)9;Access-Control-Allow-Headers&#一文帶你深入了解Node.js(圖文詳解)9;, &#一文帶你深入了解Node.js(圖文詳解)9;Content-Type,X-Custom-Header&#一文帶你深入了解Node.js(圖文詳解)9;); //配置请求头方法 * 代表全部 res.setHeader(&#一文帶你深入了解Node.js(圖文詳解)9;Access-Control-Allow-Methods&#一文帶你深入了解Node.js(圖文詳解)9;, &#一文帶你深入了解Node.js(圖文詳解)9;GET,POST,DELETE,PUT&#一文帶你深入了解Node.js(圖文詳解)9;);
5.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 分类
(一文帶你深入了解Node.js(圖文詳解))简单请求
- 请求方式:GET、POST、HEAD
-
HTTP 头部信息不超过以下几种字段:
无自定义头部字段
、Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width 、Content-Type(只有三个值application/x-www-form-urlencoded、multipart/form-data、text/plain) - 客户端与服务器只发送
一次请求
(一文帶你深入了解Node.js(圖文詳解))预检请求
- 请求方式:GET、POST、HEAD之外的方式
-
自定义
头部字段 -
OPTION预检
,成功后发送带有数据的请求
概念:只支持GET
请求
定义:组织
、存储
、管理数据
的仓库
6.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 查询
select * from userswhere id>一文帶你深入了解Node.js(圖文詳解) and id <h4> <a id="6一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)__89一文帶你深入了解Node.js(圖文詳解)"></a>6.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 插入</h4><pre class="brush:php;toolbar:false">insert into users(username,password) values(一文帶你深入了解Node.js(圖文詳解)9;jack一文帶你深入了解Node.js(圖文詳解)9;,一文帶你深入了解Node.js(圖文詳解)9;666一文帶你深入了解Node.js(圖文詳解)9;)
6.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 更新
update users set password=一文帶你深入了解Node.js(圖文詳解)9;666666一文帶你深入了解Node.js(圖文詳解)9;where username=一文帶你深入了解Node.js(圖文詳解)9;jack一文帶你深入了解Node.js(圖文詳解)9;
6.一文帶你深入了解Node.js(圖文詳解).4 删除
delete from users where id=9
6.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 初始化
- 导包:
npm i mysql
//引入mysql const mysql = require(&#一文帶你深入了解Node.js(圖文詳解)9;mysql&#一文帶你深入了解Node.js(圖文詳解)9;); //建立数据库连接 const db = mysql.createPool({ url: &#一文帶你深入了解Node.js(圖文詳解)9;一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)7.0.0.一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;,//数据库IP地址 user: &#一文帶你深入了解Node.js(圖文詳解)9;root&#一文帶你深入了解Node.js(圖文詳解)9;,//账号 password: &#一文帶你深入了解Node.js(圖文詳解)9;一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)456&#一文帶你深入了解Node.js(圖文詳解)9;,//密码 database: &#一文帶你深入了解Node.js(圖文詳解)9;test_db&#一文帶你深入了解Node.js(圖文詳解)9;//操作哪一个数据库 });
6.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 查询
const queryStr = &#一文帶你深入了解Node.js(圖文詳解)9;select * from users&#一文帶你深入了解Node.js(圖文詳解)9;; db.query(queryStr, (err, results) => { if (err) return console.log(err.message); console.log(results); }) PS E:\FED\js\node.js\node.js—资料\day总复习\code> node .\一文帶你深入了解Node.js(圖文詳解)8-mysql操作.js [ RowDataPacket { id: 一文帶你深入了解Node.js(圖文詳解), username: &#一文帶你深入了解Node.js(圖文詳解)9;zz&#一文帶你深入了解Node.js(圖文詳解)9;, password: &#一文帶你深入了解Node.js(圖文詳解)9;一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)&#一文帶你深入了解Node.js(圖文詳解)9;, status: 0 }, RowDataPacket { id: 一文帶你深入了解Node.js(圖文詳解), username: &#一文帶你深入了解Node.js(圖文詳解)9;ls&#一文帶你深入了解Node.js(圖文詳解)9;, password: &#一文帶你深入了解Node.js(圖文詳解)9;abc&#一文帶你深入了解Node.js(圖文詳解)9;, status: 0 }, RowDataPacket { id: 4, username: &#一文帶你深入了解Node.js(圖文詳解)9;jony&#一文帶你深入了解Node.js(圖文詳解)9;, password: &#一文帶你深入了解Node.js(圖文詳解)9;456&#一文帶你深入了解Node.js(圖文詳解)9;, status: 0 } ]
6.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 插入
const user = { username: &#一文帶你深入了解Node.js(圖文詳解)9;superman&#一文帶你深入了解Node.js(圖文詳解)9;, password: &#一文帶你深入了解Node.js(圖文詳解)9;jknad&#一文帶你深入了解Node.js(圖文詳解)9; }; const insertStr = &#一文帶你深入了解Node.js(圖文詳解)9;insert into users set ?&#一文帶你深入了解Node.js(圖文詳解)9;; db.query(insertStr, user, (err, results) => { if (err) return console.log(err.message); if (results.affectedRows == 一文帶你深入了解Node.js(圖文詳解)) { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;插入数据成功&#一文帶你深入了解Node.js(圖文詳解)9;); } }) //插入数据成功
6.一文帶你深入了解Node.js(圖文詳解).4 更新
const user = { id: 一文帶你深入了解Node.js(圖文詳解)0, username: &#一文帶你深入了解Node.js(圖文詳解)9;super&#一文帶你深入了解Node.js(圖文詳解)9;, password: &#一文帶你深入了解Node.js(圖文詳解)9;一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)一文帶你深入了解Node.js(圖文詳解)456&#一文帶你深入了解Node.js(圖文詳解)9; }; const updateStr = &#一文帶你深入了解Node.js(圖文詳解)9;update users set ? where id=?&#一文帶你深入了解Node.js(圖文詳解)9;; db.query(updateStr, [user, user.id], (err, results) => { if (err) return console.log(err.message); if (results.affectedRows == 一文帶你深入了解Node.js(圖文詳解)) { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;更新数据成功&#一文帶你深入了解Node.js(圖文詳解)9;); } })
6.一文帶你深入了解Node.js(圖文詳解).5 删除
(一文帶你深入了解Node.js(圖文詳解)) 一般删除
const deleteStr = &#一文帶你深入了解Node.js(圖文詳解)9;delete from users where id=?&#一文帶你深入了解Node.js(圖文詳解)9;; db.query(deleteStr, 一文帶你深入了解Node.js(圖文詳解)0, (err, results) => { if (err) return console.log(err.message); if (results.affectedRows == 一文帶你深入了解Node.js(圖文詳解)) { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;删除成功&#一文帶你深入了解Node.js(圖文詳解)9;); } })
(一文帶你深入了解Node.js(圖文詳解)) 标记删除
const deleteStr = &#一文帶你深入了解Node.js(圖文詳解)9;update users set status=一文帶你深入了解Node.js(圖文詳解) where id=?&#一文帶你深入了解Node.js(圖文詳解)9;; db.query(deleteStr, 一文帶你深入了解Node.js(圖文詳解)0, (err, results) => { if (err) return console.log(err.message); if (results.affectedRows == 一文帶你深入了解Node.js(圖文詳解)) { console.log(&#一文帶你深入了解Node.js(圖文詳解)9;删除成功&#一文帶你深入了解Node.js(圖文詳解)9;); } })
7.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 基于服务端渲染的传统 Web 开发模式
概念:服务端在后台拼接html页面
,发送给客户端,不需要ajax
特点:
- 前端耗时少
- 有利于SEO
- 占用服务端资源
- 不利于前后端分离开发
7.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) 基于前后端分离的新型 Web 开发模式
概念:后端提供API
接口,前端通过ajax
调用接口
特点:
- 开发体验好
- 用户体验好
- 减轻服务器渲染压力
- 不利于SEO
不谈业务场景而盲目选择使用何种开发模式都是耍流氓
- 例如
企業級網站
,主要功能是展示而沒有複雜的交互,並且需要良好的SEO
,則這時我們就需要使用伺服器端渲染
- 而類似
後台管理專案
,互動性
比較強,不需要考慮SEO
,那麼就可以使用前後端分離
的開發模式 - 另外,具體使用何種開發模式並不是絕對的,為了同時兼顧了首頁的渲染速度和前後端分離的開發效率,一些網站採用了
首屏伺服器端渲染其他頁面前後端分離
的開發模式
概念:透過不同的手段(驗證碼、密碼、人臉、指紋...
),認證客戶的身份
7.一文帶你深入了解Node.js(圖文詳解) Session認證機制
- 7.一文帶你深入了解Node.js(圖文詳解).一文帶你深入了解Node.js(圖文詳解) Cookie
- Cookie
:儲存在瀏覽器不超過
4KB 字串,
形式儲存
自動發送網域獨立過期時限
4KB限制容易偽造,不建議存放隱私資料
以上是一文帶你深入了解Node.js(圖文詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。