Nodejs如何解決跨域(CORS)
Nodejs解決跨域(CORS)
前后端分離的大環(huán)境下,受制于同源策略,我們需要懂得實現(xiàn)CORS(Cross-Origin Resource Sharing)
手動配置
在nodejs中,req 和 res 參數(shù)在中間件間都指向同一對象,這樣我們就可以在頭中間件中修改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是網(wǎng)關地址 如: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()) // 獲得數(shù)據(jù) .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)
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
使用Nodejs編寫一個腳本實現(xiàn)markdown轉pdf功能
Markdown?是一種輕量級的標記語言,非常適合用來寫作和記錄,將?Markdown?轉換為?PDF?可以讓文檔在格式和樣式上更加統(tǒng)一,也方便在不同設備和平臺上查看和打印,在接下來的內容中我們將講解如何使用?NodeJs?編寫一個?Markdown?轉?PDF?的腳本來實現(xiàn)我們這個想要的功能2024-05-05優(yōu)化Node.js Web應用運行速度的10個技巧
這篇文章主要介紹了優(yōu)化Node.js Web應用運行速度的10個技巧,本文講解了從并行、異步、緩存、gzip 壓縮、客戶端渲染等等技巧,需要的朋友可以參考下2014-09-09Node.js學習之TCP/IP數(shù)據(jù)通訊(實例講解)
下面小編就為大家?guī)硪黄狽ode.js學習之TCP/IP數(shù)據(jù)通訊(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10