使用 axios 从“/get”获取数据到“/”,但是得到 403 错误。 (快递、mysql、智威汤逊)
Posted
技术标签:
【中文标题】使用 axios 从“/get”获取数据到“/”,但是得到 403 错误。 (快递、mysql、智威汤逊)【英文标题】:Using axios to get data from "/get" to "/", but geting 403 error. (Express, mysql, JWT) 【发布时间】:2021-01-11 12:35:06 【问题描述】:我想要做的是将 json 数据从“/get”获取到“/”,但我不确定为什么 axios 总是给我一个 403 错误。根据我的阅读,axios 不是问题,但 cors 是。我尝试了人们推荐的所有方法,但没有任何效果。我在我的代码中做错了什么?我还在标题中看到“Referrer Policy: strict-origin-when-cross-origin”,但我不确定这是否是导致此问题的原因。
const express = require("express");
const mysql = require("mysql2");
var app = express();
const bodyparser = require("body-parser");
const cors = require("cors");
const cookieParser = require("cookie-parser");
const expressSession = require("express-session")(
secret: "secret",
resave: false,
saveUninitialized: false,
);
const passport = require("passport");
const jwt = require('jsonwebtoken');
app.use(passport.initialize());
app.use(passport.session());
app.use(bodyparser.json());
app.use(cors());
app.use(bodyparser.urlencoded( extended: false ));
app.use(express.json());
app.use(cookieParser());
app.use(expressSession);
const axios = require('axios');
var mysqlConnection = mysql.createConnection(
host: "localhost",
user: "root",
password: "",
database: "sys",
multipleStatements: true,
);
mysqlConnection.connect((err) =>
if (!err) console.log("DB connection succeded.");
else
console.log(
"DB connection failed \n Error : " + JSON.stringify(err, undefined, 2)
);
);
app.use(function(req, res, next)
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Methods', 'DELETE, PUT, GET, POST');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
);
app.listen(5000, () =>
console.log("Express server is runnig at port no : 5000")
);
app.get("/get", authenticateToken, (req, res) =>
jwt.verify(req.token, 'secretpassword', (err) =>
if (err)
res.sendStatus(403);
else
mysqlConnection.query("SELECT * FROM sys.jobs", (err, rows) =>
if (rows === undefined)
res.send("Hello World!");
else
res.send(rows);
);
);
);
app.get("/", authenticateToken, (req, res) =>
jwt.verify(req.token, 'secretpassword', async (err) =>
if (err)
res.sendStatus(403);
else
let response = await axios.get('http://localhost:5000/' +'get',
withCredentials: true,
headers:
'Access-Control-Allow-Origin': '*',
'Authorization': `Bearer
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjAwOTIyMTQ0LCJleHAiOjE2MDg2OTgxNDR9.aRsw-
jEQJ-7mlO10nBKA5VT3IL7P0b9T9K0C8aT8sUs`
);
res.send(response.data);
);
);
app.post("/login", async (req, res) =>
try
const email = req.body;
mysqlConnection.query("SELECT * FROM sys.users WHERE email = ?", [email], async (error, results) =>
const id = results[0].id;
const token = jwt.sign( id , "secretpassword",
expiresIn: '90d'
);
const cookieOptions =
expires: new Date(
Date.now() + 90 * 24 * 60 * 60 * 1000
),
secure: false,
httpOnly: true
res.cookie('jwt', token, cookieOptions);
res.status(200).redirect("/get");
);
catch (error)
console.log(error);
);
function authenticateToken(req, res, next)
const bearerHeader = req.cookies.jwt;
if (typeof bearerHeader !== 'undefined')
req.token = bearerHeader;
next();
else
res.sendStatus(403);
【问题讨论】:
【参考方案1】:使用cors 模块
const cors = require('cors')
//... your app instance code here
app.use(cors())
【讨论】:
如果你看看我的代码,我就是这么做的。它不工作。 您正在覆盖 cors 标头,请删除并检查并提供正确的错误消息 你的意思是摆脱这个。 app.use(function(req, res, next) res.header("Access-Control-Allow-Origin", "*"); res.header('Access-Control-Allow-Methods', 'DELETE, PUT , GET, POST'); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); );以上是关于使用 axios 从“/get”获取数据到“/”,但是得到 403 错误。 (快递、mysql、智威汤逊)的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.7 - 如何使用 axios.get 从 API 检索数据?
Vue Js 在我用 Axios get 调用的函数内部,将传入的数据打印到数组中
使用 axios.get 方法加载页面时,如何仅从 API 获取数据一次?
无法使用 api 从 axios 获取数据 - vue js