Node.js 在尝试从电影数据库Api访问数据时,如何解决此CORS错误?

Node.js 在尝试从电影数据库Api访问数据时,如何解决此CORS错误?,node.js,reactjs,mongodb,react-redux,cors,Node.js,Reactjs,Mongodb,React Redux,Cors,提前谢谢您 const jwt = require('jsonwebtoken'); const config = require('config'); module.exports = (req, res, next) => { const token = req.header('x-auth-token'); if(!token) { return res.status(401).json({ message: 'No token, auth

提前谢谢您

const jwt = require('jsonwebtoken');
const config = require('config');

module.exports = (req, res, next) => {
    const token = req.header('x-auth-token');
    
    if(!token) {
        return res.status(401).json({ message: 'No token, authorization denied' })
    }
 

    try {
        const decoded = jwt.verify(token, config.get('jwtSecret'));
        console.log('Decoded', decoded)

        req.user = decoded.user;
        console.log('Req User', req.user)
        next();
    } catch (err) {
        res.status(401).json({ message: 'Token is not valid' })
    }
}
// @route    GET api/auth
// @desc     Get user by token
// @access   Private
router.get('/', auth, async (req, res) => {
  try {
    const user = await User.findById(req.user.id).select('-password');
    res.json(user);
  } catch (err) {
    console.error(err.message);
    res.status(500).send('Server Error');
  }
});
我知道这里有很多问题,要想解决这个问题肯定会非常困难。我只想说我很感激任何一个花时间来解决我的麻烦的人。这是我真正完成的第一个项目,碰到像这样的顽固的东西真是太糟糕了,哈哈。这就是我们签约的原因。我仍将继续努力独自解决这个问题。再次感谢

实时错误示例

const jwt = require('jsonwebtoken');
const config = require('config');

module.exports = (req, res, next) => {
    const token = req.header('x-auth-token');
    
    if(!token) {
        return res.status(401).json({ message: 'No token, authorization denied' })
    }
 

    try {
        const decoded = jwt.verify(token, config.get('jwtSecret'));
        console.log('Decoded', decoded)

        req.user = decoded.user;
        console.log('Req User', req.user)
        next();
    } catch (err) {
        res.status(401).json({ message: 'Token is not valid' })
    }
}
// @route    GET api/auth
// @desc     Get user by token
// @access   Private
router.get('/', auth, async (req, res) => {
  try {
    const user = await User.findById(req.user.id).select('-password');
    res.json(user);
  } catch (err) {
    console.error(err.message);
    res.status(500).send('Server Error');
  }
});

现场工作示例

const jwt = require('jsonwebtoken');
const config = require('config');

module.exports = (req, res, next) => {
    const token = req.header('x-auth-token');
    
    if(!token) {
        return res.status(401).json({ message: 'No token, authorization denied' })
    }
 

    try {
        const decoded = jwt.verify(token, config.get('jwtSecret'));
        console.log('Decoded', decoded)

        req.user = decoded.user;
        console.log('Req User', req.user)
        next();
    } catch (err) {
        res.status(401).json({ message: 'Token is not valid' })
    }
}
// @route    GET api/auth
// @desc     Get user by token
// @access   Private
router.get('/', auth, async (req, res) => {
  try {
    const user = await User.findById(req.user.id).select('-password');
    res.json(user);
  } catch (err) {
    console.error(err.message);
    res.status(500).send('Server Error');
  }
});

问题

const jwt = require('jsonwebtoken');
const config = require('config');

module.exports = (req, res, next) => {
    const token = req.header('x-auth-token');
    
    if(!token) {
        return res.status(401).json({ message: 'No token, authorization denied' })
    }
 

    try {
        const decoded = jwt.verify(token, config.get('jwtSecret'));
        console.log('Decoded', decoded)

        req.user = decoded.user;
        console.log('Req User', req.user)
        next();
    } catch (err) {
        res.status(401).json({ message: 'Token is not valid' })
    }
}
// @route    GET api/auth
// @desc     Get user by token
// @access   Private
router.get('/', auth, async (req, res) => {
  try {
    const user = await User.findById(req.user.id).select('-password');
    res.json(user);
  } catch (err) {
    console.error(err.message);
    res.status(500).send('Server Error');
  }
});
在整个问题中有三个步骤。第三步是我遇到问题的地方

第一步,当应用程序加载时,它将呈现一个登录组件页面,该页面将请求用户凭据。然后我将使用有效凭据登录。一旦我点击submit,它就会点击我在后端的一条与用户身份验证有关的快捷路线。这个路由将要做的是检查我的MongoDB,看看这个用户是否已经存在,然后从“jsonwebtoken”npm包生成一个令牌,并将该令牌作为响应发送回来。在前端,我将拥有在本地存储中设置该令牌的功能。如果本地存储中存在令牌,那么我将加载用户凭据(令牌、用户名等)并重新路由到/home组件

第二步,一旦主组件呈现/装载,我将从前端向电影数据库Api发出另一个请求,并呈现显示其电影横幅的流行电影列表。 返回的数据很好

第三步问题,当我点击一部流行电影时,我从前端向电影数据库Api发出另一个请求,该Api将流行电影的Id作为参数传递,并作为响应返回电影详细信息。同时,我将路由到movieDetails组件。问题是,我实际上没有得到数据。相反,我得到了CORS错误

CORS错误

export const loadUser = () => async dispatch => {
    if(localStorage.token) {
        setAuthToken(localStorage.token)
    }

    try {
        const res = await axios.get('/api/auth');
        dispatch({
            type: USER_LOADED,
            payload: res.data
        })
        console.log(res.data)
    } catch (err) {
        dispatch({
            type: AUTH_ERROR
        })
    }
}
访问位于“”的XMLHttpRequesthttps://api.themoviedb.org/3/movie/419704?api_key=XXXXXX&append_to_response=credits“起源”http://localhost:3000'已被CORS策略阻止:飞行前响应中的访问控制允许标头不允许请求标头字段x-auth-token

其他控制台错误

import React, { Fragment, useEffect } from "react";
import "./App.css";
import { Route, Switch } from "react-router-dom";
// Components
import Landing from "./pages/landing/landing.component";
import Home from "./pages/home/home.component";
import Navbar from "./components/navbar/navbar.component";
import MovieDetails from "./pages/movie-details/movie-details.component";
import Search from "./pages/search/search.component";
import Sidebar from "./components/sidebar/sidebar.component";
import SidebarDesktop from "./components/sidebar-desktop/sidebar-desktop.component";
import SignInAndSignUp from "./pages/sign-in-and-sign-up/sign-in-and-sign-up.component";
import Thread from "./pages/thread/thread.component";
import SignUp from "./pages/sign-up/sign-up.component";

// Redux
import { connect } from "react-redux";
import { getPopular } from "./redux/movies/movies.actions";
import { loadUser } from "./redux/auth/auth.actions";
import setAuthToken from "./utils/setAuthToken";

if (localStorage.token) {
  setAuthToken(localStorage.token);
}

const App = ({ getPopular, loadUser }) => {
  useEffect(() => {
    getPopular();
    console.log("Rendered");
    loadUser();
  }, []);
  return (
    <Fragment>
      <Navbar />
      <Switch>
        <Route exact path="/" component={Landing} />
        <Route exact path="/home" component={Home} />
        <Route exact path="/signup" component={SignUp} />
        <Route exact path="/movie-details/:slug" component={MovieDetails} />
        <Route exact path="/search/:title" component={Search} />
        <Route exact path="/sign-in-and-sign-up" component={SignInAndSignUp} />
      </Switch>
    </Fragment>
  );
};

export default connect(null, { getPopular, loadUser })(App);
获取网络::ERR_失败

未捕获(承诺中)错误:网络错误 在createError(createError.js:16) 位于XMLHttpRequest.handleError(xhr.js:83)

setAuthToken()部分

此外,我还有一个名为setAuthToken的实用程序函数,它涉及上面CORS错误中显示的“x-auth-token”。 这几乎只是为每个axios请求将x-auth-token头设置为一个present token,前提是存在一个token

import axios from 'axios';

const setAuthToken = (token) => {
    if(token) {
        axios.defaults.headers.common['x-auth-token'] = token;
        console.log(axios.defaults.headers.common)
    }else {
        delete axios.defaults.headers.common['x-auth-token']
    }
}

export default setAuthToken;
我在App.js中使用了两次此函数

App.js

import React, { Fragment, useEffect } from "react";
import "./App.css";
import { Route, Switch } from "react-router-dom";
// Components
import Landing from "./pages/landing/landing.component";
import Home from "./pages/home/home.component";
import Navbar from "./components/navbar/navbar.component";
import MovieDetails from "./pages/movie-details/movie-details.component";
import Search from "./pages/search/search.component";
import Sidebar from "./components/sidebar/sidebar.component";
import SidebarDesktop from "./components/sidebar-desktop/sidebar-desktop.component";
import SignInAndSignUp from "./pages/sign-in-and-sign-up/sign-in-and-sign-up.component";
import Thread from "./pages/thread/thread.component";
import SignUp from "./pages/sign-up/sign-up.component";

// Redux
import { connect } from "react-redux";
import { getPopular } from "./redux/movies/movies.actions";
import { loadUser } from "./redux/auth/auth.actions";
import setAuthToken from "./utils/setAuthToken";

if (localStorage.token) {
  setAuthToken(localStorage.token);
}

const App = ({ getPopular, loadUser }) => {
  useEffect(() => {
    getPopular();
    console.log("Rendered");
    loadUser();
  }, []);
  return (
    <Fragment>
      <Navbar />
      <Switch>
        <Route exact path="/" component={Landing} />
        <Route exact path="/home" component={Home} />
        <Route exact path="/signup" component={SignUp} />
        <Route exact path="/movie-details/:slug" component={MovieDetails} />
        <Route exact path="/search/:title" component={Search} />
        <Route exact path="/sign-in-and-sign-up" component={SignInAndSignUp} />
      </Switch>
    </Fragment>
  );
};

export default connect(null, { getPopular, loadUser })(App);
中间件-获取身份验证路由

const jwt = require('jsonwebtoken');
const config = require('config');

module.exports = (req, res, next) => {
    const token = req.header('x-auth-token');
    
    if(!token) {
        return res.status(401).json({ message: 'No token, authorization denied' })
    }
 

    try {
        const decoded = jwt.verify(token, config.get('jwtSecret'));
        console.log('Decoded', decoded)

        req.user = decoded.user;
        console.log('Req User', req.user)
        next();
    } catch (err) {
        res.status(401).json({ message: 'Token is not valid' })
    }
}
// @route    GET api/auth
// @desc     Get user by token
// @access   Private
router.get('/', auth, async (req, res) => {
  try {
    const user = await User.findById(req.user.id).select('-password');
    res.json(user);
  } catch (err) {
    console.error(err.message);
    res.status(500).send('Server Error');
  }
});
获取授权路由

const jwt = require('jsonwebtoken');
const config = require('config');

module.exports = (req, res, next) => {
    const token = req.header('x-auth-token');
    
    if(!token) {
        return res.status(401).json({ message: 'No token, authorization denied' })
    }
 

    try {
        const decoded = jwt.verify(token, config.get('jwtSecret'));
        console.log('Decoded', decoded)

        req.user = decoded.user;
        console.log('Req User', req.user)
        next();
    } catch (err) {
        res.status(401).json({ message: 'Token is not valid' })
    }
}
// @route    GET api/auth
// @desc     Get user by token
// @access   Private
router.get('/', auth, async (req, res) => {
  try {
    const user = await User.findById(req.user.id).select('-password');
    res.json(user);
  } catch (err) {
    console.error(err.message);
    res.status(500).send('Server Error');
  }
});
此时,应用程序现在拥有当前已验证用户的信息

重复操作

import React, { Fragment, useEffect } from "react";
import "./App.css";
import { Route, Switch } from "react-router-dom";
// Components
import Landing from "./pages/landing/landing.component";
import Home from "./pages/home/home.component";
import Navbar from "./components/navbar/navbar.component";
import MovieDetails from "./pages/movie-details/movie-details.component";
import Search from "./pages/search/search.component";
import Sidebar from "./components/sidebar/sidebar.component";
import SidebarDesktop from "./components/sidebar-desktop/sidebar-desktop.component";
import SignInAndSignUp from "./pages/sign-in-and-sign-up/sign-in-and-sign-up.component";
import Thread from "./pages/thread/thread.component";
import SignUp from "./pages/sign-up/sign-up.component";

// Redux
import { connect } from "react-redux";
import { getPopular } from "./redux/movies/movies.actions";
import { loadUser } from "./redux/auth/auth.actions";
import setAuthToken from "./utils/setAuthToken";

if (localStorage.token) {
  setAuthToken(localStorage.token);
}

const App = ({ getPopular, loadUser }) => {
  useEffect(() => {
    getPopular();
    console.log("Rendered");
    loadUser();
  }, []);
  return (
    <Fragment>
      <Navbar />
      <Switch>
        <Route exact path="/" component={Landing} />
        <Route exact path="/home" component={Home} />
        <Route exact path="/signup" component={SignUp} />
        <Route exact path="/movie-details/:slug" component={MovieDetails} />
        <Route exact path="/search/:title" component={Search} />
        <Route exact path="/sign-in-and-sign-up" component={SignInAndSignUp} />
      </Switch>
    </Fragment>
  );
};

export default connect(null, { getPopular, loadUser })(App);
这就是我在尝试访问特定电影的详细信息时遇到CORS错误的地方

export const getMovieById = (id) => async (dispatch) => {
  let API_KEY = "XXXXXXX";
  let baseURL = "https://api.themoviedb.org/3/";

  try {
    axios
      .get(
        `${baseURL}movie/${id}?api_key=${API_KEY}&append_to_response=credits`
      )

      .then((res) => {
        // Target Cast List and Enable Profile Image
        res.data.credits.cast.map((profile) => {
          profile.profile_image = `https://image.tmdb.org/t/p/original${profile.profile_path}`;
        });
        res.data.credits.cast.map((profile) => {
          if (
            profile.profile_image === "https://image.tmdb.org/t/p/originalnull"
          ) {
            profile.notFoundIcon = "fas fa-user fa-3x";
          }
        });

        // Target Crew List and Enable Profile Image
        res.data.credits.crew.map((profile) => {
          profile.profile_image = `https://image.tmdb.org/t/p/original${profile.profile_path}`;
        });
        res.data.credits.crew.map((profile) => {
          if (
            profile.profile_image === "https://image.tmdb.org/t/p/originalnull"
          ) {
            profile.notFoundIcon = "fas fa-user fa-3x";
          }
        });

        const movie = {
          ...res.data,
          customImageURL: `https://image.tmdb.org/t/p/w500${res.data.poster_path}`,
          customBanner: `https://image.tmdb.org/t/p/w500${res.data.backdrop_path}`,
        };

        dispatch({
          type: GET_MOVIE_DETAILS,
          payload: movie,
        });
      });
  } catch (err) {
    if (err) throw err;
    console.log("Server Error");
    console.error("Server Error");
  }
};
最后的想法

import React, { Fragment, useEffect } from "react";
import "./App.css";
import { Route, Switch } from "react-router-dom";
// Components
import Landing from "./pages/landing/landing.component";
import Home from "./pages/home/home.component";
import Navbar from "./components/navbar/navbar.component";
import MovieDetails from "./pages/movie-details/movie-details.component";
import Search from "./pages/search/search.component";
import Sidebar from "./components/sidebar/sidebar.component";
import SidebarDesktop from "./components/sidebar-desktop/sidebar-desktop.component";
import SignInAndSignUp from "./pages/sign-in-and-sign-up/sign-in-and-sign-up.component";
import Thread from "./pages/thread/thread.component";
import SignUp from "./pages/sign-up/sign-up.component";

// Redux
import { connect } from "react-redux";
import { getPopular } from "./redux/movies/movies.actions";
import { loadUser } from "./redux/auth/auth.actions";
import setAuthToken from "./utils/setAuthToken";

if (localStorage.token) {
  setAuthToken(localStorage.token);
}

const App = ({ getPopular, loadUser }) => {
  useEffect(() => {
    getPopular();
    console.log("Rendered");
    loadUser();
  }, []);
  return (
    <Fragment>
      <Navbar />
      <Switch>
        <Route exact path="/" component={Landing} />
        <Route exact path="/home" component={Home} />
        <Route exact path="/signup" component={SignUp} />
        <Route exact path="/movie-details/:slug" component={MovieDetails} />
        <Route exact path="/search/:title" component={Search} />
        <Route exact path="/sign-in-and-sign-up" component={SignInAndSignUp} />
      </Switch>
    </Fragment>
  );
};

export default connect(null, { getPopular, loadUser })(App);
所以我有两个服务器在运行,它们是react和express。我使用npm包“并发”同时运行两台服务器。我在package.json中有正确的代码,可以实现这一点。此外,我正在通过连接到后端的react client package.json运行代理

这是踢球者

export const loadUser = () => async dispatch => {
    if(localStorage.token) {
        setAuthToken(localStorage.token)
    }

    try {
        const res = await axios.get('/api/auth');
        dispatch({
            type: USER_LOADED,
            payload: res.data
        })
        console.log(res.data)
    } catch (err) {
        dispatch({
            type: AUTH_ERROR
        })
    }
}
当我只启动react服务器而不是两者都启动时,我的应用程序运行良好,并且在单击流行电影以检索电影数据时,我没有遇到CORS错误。但是当我同时运行这两个服务器时,我会在单击一部流行电影时出现CORS错误

实时错误示例

const jwt = require('jsonwebtoken');
const config = require('config');

module.exports = (req, res, next) => {
    const token = req.header('x-auth-token');
    
    if(!token) {
        return res.status(401).json({ message: 'No token, authorization denied' })
    }
 

    try {
        const decoded = jwt.verify(token, config.get('jwtSecret'));
        console.log('Decoded', decoded)

        req.user = decoded.user;
        console.log('Req User', req.user)
        next();
    } catch (err) {
        res.status(401).json({ message: 'Token is not valid' })
    }
}
// @route    GET api/auth
// @desc     Get user by token
// @access   Private
router.get('/', auth, async (req, res) => {
  try {
    const user = await User.findById(req.user.id).select('-password');
    res.json(user);
  } catch (err) {
    console.error(err.message);
    res.status(500).send('Server Error');
  }
});

现场工作示例

const jwt = require('jsonwebtoken');
const config = require('config');

module.exports = (req, res, next) => {
    const token = req.header('x-auth-token');
    
    if(!token) {
        return res.status(401).json({ message: 'No token, authorization denied' })
    }
 

    try {
        const decoded = jwt.verify(token, config.get('jwtSecret'));
        console.log('Decoded', decoded)

        req.user = decoded.user;
        console.log('Req User', req.user)
        next();
    } catch (err) {
        res.status(401).json({ message: 'Token is not valid' })
    }
}
// @route    GET api/auth
// @desc     Get user by token
// @access   Private
router.get('/', auth, async (req, res) => {
  try {
    const user = await User.findById(req.user.id).select('-password');
    res.json(user);
  } catch (err) {
    console.error(err.message);
    res.status(500).send('Server Error');
  }
});

需要主服务器文件中的COR,我认为在您的情况下是app.js 使用安装cors

npm install cors
而不是在app.js文件中要求它

let cors = require('cors');
此后

app.use(cors());

这将接受客户端的所有请求

只是好奇您是否正在使用电影API服务器上的“cors”包

出现此问题的最可能原因是React应用程序和电影数据库API之间的飞行前检查。在进行任何通信之前,浏览器会询问服务器是否配置为接受来自不同来源的请求

要解决“CORS”问题,您需要通过安装以下软件包来允许跨源。请确保您在电影数据库API项目中

npm install cors
安装软件包后,需要配置电影数据库API中间件,并将以下内容添加到express应用程序中

首先导入包依赖项:

const cors = require('cors');
假设express应用程序的初始化存储在名为“app”的变量中:

如果您想了解有关“cors”软件包的更多信息,请参阅下面的链接。如果链接过期,您可以在web上快速搜索“express cors”


虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-那么你面临的问题是什么?