后端接口項目搭建:
一. 安裝依賴:
- npm init
- npm install koa2
- npm i koa-router
- npm i koa2-cors // 解決跨域
二. 編寫接口
在根目錄新建一個入口文件 server.js 內容如下:
const koa = require('koa2');
const app = new koa();
const router = require('koa-router')();
// CORS是一個W3C標准,全稱是"跨域資源共享"(Cross-origin resource sharing)。
// 下面以koa2-cors為例,
const cors = require('koa2-cors');
// app.use(cors()); // 全部允許跨域
app.use(cors({ // 指定一個或多個可以跨域的域名
origin: function (ctx) { // 設置允許來自指定域名請求
if (ctx.url === '/test') {
return "*"; // 允許來自所有域名請求, 這個不管用
}
return 'http://localhost:8000'; // 這樣就能只允許 http://localhost:8000 這個域名的請求了
},
maxAge: 5, // 指定本次預檢請求的有效期,單位為秒。
credentials: true, // 是否允許發送Cookie
allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], // 設置所允許的HTTP請求方法
allowHeaders: ['Content-Type', 'Authorization', 'Accept'], // 設置服務器支持的所有頭信息字段
exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'] // 設置獲取其他自定義字段
}))
router.post('/', async function (ctx) {
ctx.body = JSON.stringify({ data: '恭喜 __小朱__ 你成功登陸了' })
});
app.use(router.routes())
app.use(router.allowedMethods());
app.listen(3000);
三. 修改 package.json 文件
在 "scripts" 里加入 "start": "node server.js"
四. 啟動項目
在跟目錄執行 - npm run start
前端請求
到此為止,后端服務器已經搭建並開啟了。並且 url 地址是:http://localhost:3000
可接收的請求地址:http://localhost:8000,即我們的前端項目的本地地址。
當然也可以設置成全部地址允許跨域:app.use(cors())
fetch("http://localhost:3000", {
method:'post'
}).then((res, req) => {
return res.json()
}).then(res => {
console.log(res) // {data: "恭喜 __小朱__ 你成功登陸了"}
})
深入研究
下面我們以具體的請求頭信息解釋上面的代碼,也就是cors具體的實現過程
// 我們可以用下面的中間件理解app.use(cors({})) app.use(async (ctx, next) => { // 允許來自所有域名請求 ctx.set("Access-Control-Allow-Origin", "*"); // 這樣就能只允許 http://localhost:8080 這個域名的請求了 // ctx.set("Access-Control-Allow-Origin", "http://localhost:8080"); // 設置所允許的HTTP請求方法 ctx.set("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE"); // 字段是必需的。它也是一個逗號分隔的字符串,表明服務器支持的所有頭信息字段. ctx.set("Access-Control-Allow-Headers", "x-requested-with, accept, origin, content-type"); // 服務器收到請求以后,檢查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,確認允許跨源請求,就可以做出回應。 // Content-Type表示具體請求中的媒體類型信息 ctx.set("Content-Type", "application/json;charset=utf-8"); // 該字段可選。它的值是一個布爾值,表示是否允許發送Cookie。默認情況下,Cookie不包括在CORS請求之中。 // 當設置成允許請求攜帶cookie時,需要保證"Access-Control-Allow-Origin"是服務器有的域名,而不能是"*"; ctx.set("Access-Control-Allow-Credentials", true); // 該字段可選,用來指定本次預檢請求的有效期,單位為秒。 // 當請求方法是PUT或DELETE等特殊方法或者Content-Type字段的類型是application/json時,服務器會提前發送一次請求進行驗證 // 下面的的設置只本次驗證的有效時間,即在該時間段內服務端可以不用進行驗證 ctx.set("Access-Control-Max-Age", 300); /* CORS請求時,XMLHttpRequest對象的getResponseHeader()方法只能拿到6個基本字段: Cache-Control、 Content-Language、 Content-Type、 Expires、 Last-Modified、 Pragma。 */ // 需要獲取其他字段時,使用Access-Control-Expose-Headers, // getResponseHeader('myData')可以返回我們所需的值 ctx.set("Access-Control-Expose-Headers", "myData"); await next(); })
理解的上面的代碼,估計你也能猜到app.use(cors({}))里面的配置信息了。當然還有其他可選的信息,具體設置並無多大差別,在這就不多解釋了。
