首頁 > 軟體

Nodejs如何解決跨域(CORS)

2023-01-18 14:01:22

Nodejs解決跨域(CORS)

前後端分離的大環境下,受制於同源策略,我們需要懂得實現CORS(Cross-Origin Resource Sharing)

手動設定

在nodejs中,req 和 res 引數在中介軟體間都指向同一物件,這樣我們就可以在頭中介軟體中修改res 的header。如下:

const express = require('express')
 
const app = express();
 
app.use((req, res) => {
    //在這裡手動設定
    res.header('Access-Control-Allow-Origin', 'example.com');
})

CORS模組

我們也可以通過引入cors模組快速設定。

npm i cors --save   //不是node的內建模組,需要先下載

const express = require('express')
const cors = require('cors')
 
const app = express();
 
const corsConfig = {
  origin:'http://localhost:8080',
  credentials:true,
}
//使用預設
app.use(cors())
//或修改預設設定
app.use(cors(corsConfig)) 

axios

值得注意的一點是cors模組會將 Access-Control-Allow-Origin 預設配為 *,但是axios不接受萬用字元*。而且axios還需要 Access-Control-Allow-Credentials 屬性為true。

Credentials我們可以手動設定,Access-Control-Allow-Origin 我們可以如下設定 :

const express = require('express')
const cors = require('cors')
 
const app = express();
 
//使用預設
app.use(cors())
   .use((req, res, next) => {
        console.log(req);
        res.setHeader('Access-Control-Allow-Origin',req.origin),
        next()
    })
//req.origin是閘道器地址 如:http://192.168.1.1 

注意:本地偵錯的時候axios不認為 localhost:8080 等於127.0.0.1:8080

Nodejs CORS跨域問題

在響應頭裡設定:'Access-Control-Allow-Origin': '*'

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>cors</title>
</head>

<body>
    <script>
    	// 請求地址
        fetch('http://localhost:3000/api/data')
        	// 請求體解析
            .then(res => res.json())
            // 獲得資料
            .then(result => console.log(result))
    </script>
</body>

</html>

server.js

const http = require('http');
const libUrl = require('url')

http.createServer((req, res) => {
    const url = libUrl.parse(req.url, true);

    if (url.pathname === '/favicon.ico') return;

    if (url.pathname === '/api/data') {
        res.writeHead(200, {
            'Content-Type': 'Application/json',
            // 設定允許所有埠存取
            'Access-Control-Allow-Origin': '*'
        });
        let obj = {
            name: '張三',
            age: 20,
            sex: '男'
        };
        res.write(JSON.stringify(obj));
    }
    res.end();
}).listen(3000)

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com