Nodejs如何解决跨域(CORS)
作者:我的demo不烂尾
这篇文章主要介绍了Nodejs如何解决跨域(CORS)问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
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)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。