Node.js使用express寫接口的具體代碼
創(chuàng)建基本的服務(wù)器
//導(dǎo)入express模塊 const express =require('rexpress') //創(chuàng)建express的服務(wù)器實(shí)例 const app=express() .... //調(diào)用app.listen方法 ,指定端口號(hào)并啟動(dòng)web服務(wù)器 app.listen(80,function(){ console.log('server running at http://127.0.0.1'); })
創(chuàng)建API路由模塊
// apiRouter.js var express=require('express') //導(dǎo)入express var apiRouter=express.Router() //創(chuàng)建路由對(duì)象 module.exports=router //向外導(dǎo)出對(duì)象 //app.js const apiRouter=require('./apiRouter') app.use('api',apiRouter)
編寫GET接口
apiRouter.get('/get',(req,res)=>{ //1.獲取到客戶端通過查詢字符串,發(fā)送到服務(wù)器的數(shù)據(jù) const query=req.query //2.調(diào)用res.send()方法 ,把數(shù)據(jù)響應(yīng)給客戶端 ? ? res.send({ ? ? ? ? status:0,?? ??? ? ? ? ? //狀態(tài),0表示成功 ?1表示失敗 ? ? ? ? msg:'GET請(qǐng)求成功,?? ??? ?// 狀態(tài)描述 ? ? ? ? data:query?? ??? ? ? ? ? //需要響應(yīng)給客戶端的數(shù)據(jù) ? ? }) })
編寫POST接口
apiRouter.post('/post',(req,res)=>{ //1.獲取到客戶端通過查詢字符串,發(fā)送到服務(wù)器的數(shù)據(jù) const body=req.body //2.調(diào)用res.send()方法 ,把數(shù)據(jù)響應(yīng)給客戶端 ? ? res.send({ ? ? ? ? status:0,?? ??? ? ? ? ? //狀態(tài),0表示成功 ?1表示失敗 ? ? ? ? msg:'POST請(qǐng)求成功,?? ??? ?// 狀態(tài)描述 ? ? ? ? data:body?? ??? ? ? ? ? //需要響應(yīng)給客戶端的數(shù)據(jù) ? ? }) })
在拿到路由之前需要配置解析表單的中間件
//配置解析表單數(shù)據(jù)的中間件 app.use(express.urlencoded({extended:false}))
CROS跨域資源共享
1.接口的跨域問題
剛才編寫的GET和POST接口,存在一個(gè)很嚴(yán)重的問題:不支持跨域請(qǐng)求。解決接口跨域問題的方案主要有兩種
- CORS(主流的解決方案,推薦使用)CORS(主流的解決方案,推薦使用)
- JSONP(有缺陷的解決方案:只支持GET請(qǐng)求)有缺陷的解決方案:只支持GET請(qǐng)求
2.使用cros中間件拒絕跨域問題
cros是Express的一個(gè)第三方的中間件。通過安裝和配置cors中間件,可以很方便的解決跨域問題
使用步驟
- 運(yùn)行npm install cros 安裝中間件
- 使用const cros=require(‘cros’)導(dǎo)入中間件
- 在路由之前調(diào)用app.use(cros())配置中間件
3.什么是cros
cros(Cross-Origin Resource Sharing,跨域資源共享)由一系列HTTP響應(yīng)頭組成,這些HTTP響應(yīng)頭決定瀏覽器是否阻止前端JS代碼跨域獲取資源
瀏覽器的同源安全策略默認(rèn)會(huì)阻止網(wǎng)頁(yè)"跨域"或缺資源,但是如果接口服務(wù)器配置了CROS相關(guān)的HTTP響應(yīng)頭
就可以接觸瀏覽器端的跨域訪問限制
4.cros的注意事項(xiàng)
- cros主要在服務(wù)器端進(jìn)行配置??蛻舳藶g覽器無(wú)需做任何額外的配置,即可請(qǐng)求開啟了cros的接口
- cros在瀏覽器在有兼容性。
5.cros請(qǐng)求的分類
客戶端在請(qǐng)求cors接口時(shí),根據(jù) 請(qǐng)求方式和請(qǐng)求頭的不同,跨域?qū)ros的請(qǐng)求分為兩大類,分別是:
- 簡(jiǎn)單請(qǐng)求
- 請(qǐng)求方式:GET,POST,HEAT 三者之一
- HTTP頭部信息不超過一下幾種字段:無(wú)自定義頭部,Accept,Accept-Language,Content-Language,DPR,Dpwnlink,Sava-Data,Viewport-Width,Width,Content-Type
- 預(yù)檢請(qǐng)求
- 請(qǐng)求方式為GET,POST,HEAD之外的請(qǐng)求Method類型
- 請(qǐng)求頭在包含自定義頭部字段
- 向服務(wù)器發(fā)送了application/json格式的數(shù)據(jù)
在瀏覽器與服務(wù)器正式通信之前,瀏覽器會(huì)發(fā)送OPTION請(qǐng)求進(jìn)行預(yù)檢,以獲取瀏覽器是否允許該實(shí)際請(qǐng)求,所以這一次的OPTION請(qǐng)求為“預(yù)檢請(qǐng)求”,服務(wù)器成功響應(yīng)預(yù)檢請(qǐng)求后,才會(huì)發(fā)送真正的請(qǐng)求,并且攜帶真實(shí)數(shù)據(jù)
6.簡(jiǎn)單請(qǐng)求和預(yù)檢請(qǐng)求的區(qū)別
簡(jiǎn)單請(qǐng)求的特點(diǎn): 客戶端與服務(wù)器之間只會(huì)發(fā)生一次請(qǐng)求。
預(yù)檢請(qǐng)求的特點(diǎn): 客戶端與服務(wù)器之間會(huì)發(fā)生兩次請(qǐng)求,OPTION預(yù)檢請(qǐng)求成功之后,才會(huì)發(fā)起真正的請(qǐng)求。
JSONP接口
1.回顧jsonp的概念和特點(diǎn)
概念 :瀏覽器通過/
特點(diǎn):
- JSONP不屬于真正的ajax請(qǐng)求,因?yàn)樗鼪]有使用XMLHttpRequest這個(gè)對(duì)象
- JSONP僅支持GET請(qǐng)求,不支持POST,PUT,DELETE等請(qǐng)求
2.創(chuàng)建jsonp接口的注意事項(xiàng)
如果項(xiàng)目中已經(jīng)配置了CROS的跨域資源共享,為了防止沖突,必須在配置CROS中間件之前聲明JSONP的接口,否則JSONP接口會(huì)被處理成開啟了CROS的接口
3.實(shí)現(xiàn)JSONP接口的步驟
- 獲取客戶端的發(fā)送過來(lái)的回調(diào)函數(shù)的名字
- 得到要通過JSONP形式發(fā)送給客戶端的數(shù)據(jù) JSON.stringify()
- 根據(jù)前面兩走的到的數(shù)據(jù),拼接出一個(gè)函數(shù)調(diào)用的字符串
- 把上一步拼接得到的字符串,響應(yīng)給客戶端的/
4.實(shí)現(xiàn)JSONP接口的具體代碼
app.get('/api/jsonp',(req,res)=>{ ? //獲取客戶端發(fā)送過來(lái)的回調(diào)函數(shù)的名字 ? const ?funcName=req.query.callback ? //得到要通過JSONP形式發(fā)送給客戶端的數(shù)據(jù) ? const data={name:'zs',age:22} ? //根據(jù)前面兩步得到的數(shù)據(jù),拼接一個(gè)函數(shù)調(diào)用的字符串 ? const scriptStr=`${funcName}(${JSON.stringify(data)})` ? //把上一步得到的拼接字符串,響應(yīng)給客戶端的<script>標(biāo)簽進(jìn)行解析 ? res.send(scriptStr) })
5.在網(wǎng)頁(yè)在使用jq發(fā)起jsonp請(qǐng)求
調(diào)用$.ajax(),提供JSONP的配置請(qǐng)求,從而發(fā)起JSONP請(qǐng)求
$("#btnJSONP").on("click", function () { ? ? $.ajax({ ? ? ? ? type: "GET", ? ? ? ? url: "http://127.0.0.1/api/jsonp", ? ? ? ? dataType: "jsonp", ? ? ? ? success: function (res) { ? ? ? ? console.log(res); ? ? ? ? }, ? ? }); });
到此這篇關(guān)于Node.js使用express寫接口的文章就介紹到這了,更多相關(guān)Node.js使用express寫接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- node.js中koa和express的差異對(duì)比
- Node.js中Express框架使用axios同步請(qǐng)求(async+await)實(shí)現(xiàn)方法
- node.js使用express-jwt報(bào)錯(cuò):expressJWT?is?not?a?function解決
- Node.js?express中的身份認(rèn)證的實(shí)現(xiàn)
- 使用Express+Node.js對(duì)mysql進(jìn)行增改查操作?
- node.js三個(gè)步驟實(shí)現(xiàn)一個(gè)服務(wù)器及Express包使用
- Node.js中Express框架的使用教程詳解
- node.js+express留言板功能實(shí)現(xiàn)示例
- node.js使用express-fileupload中間件實(shí)現(xiàn)文件上傳
- Node.js+express+socket實(shí)現(xiàn)在線實(shí)時(shí)多人聊天室
- Express框架實(shí)現(xiàn)簡(jiǎn)單攔截器功能示例
相關(guān)文章
Node.js開發(fā)教程之基于OnceIO框架實(shí)現(xiàn)文件上傳和驗(yàn)證功能
這篇文章主要介紹了Node.js開發(fā)教程之基于OnceIO框架實(shí)現(xiàn)文件上傳和驗(yàn)證的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11讓nodeJS支持ES6的詞法----babel的安裝和使用方法
這篇文章主要介紹了讓nodeJS支持ES6的詞法----babel的安裝和使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07如何用npm命令刪除開發(fā)項(xiàng)目中的node_modules文件夾
每個(gè)項(xiàng)目都會(huì)產(chǎn)生一個(gè)node_modules,每個(gè)node_modules少則幾十兆,多則幾百甚至上千兆,隨著時(shí)間的積累,維護(hù)項(xiàng)目的增加,整個(gè)項(xiàng)目目錄體積會(huì)越來(lái)越大,這篇文章主要給大家介紹了關(guān)于如何用npm命令刪除開發(fā)項(xiàng)目中的node_modules文件夾,需要的朋友可以參考下2023-12-12koa2上傳文件及https配置實(shí)現(xiàn)教程
這篇文章主要為大家介紹了koa2上傳文件及https配置實(shí)現(xiàn)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06