用 Koa2 搭建一個可跨域的本地接口服務,並在前端進行訪問。


后端接口項目搭建:

一. 安裝依賴:

- 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({}))里面的配置信息了。當然還有其他可選的信息,具體設置並無多大差別,在這就不多解釋了。

 

 

 
 
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM