【问题标题】:ReactJS No 'Access-Control-Allow-Origin'ReactJS 没有“访问控制允许来源”
【发布时间】:2016-12-18 22:53:49
【问题描述】:

我在从我的网站链接加载字体时遇到问题。根据我所见,我的 server.js 中有一个错误,即我的标头中不存在 CORS。现在,我的问题是如何将标头插入到我的 server.js 中有人可以帮助我吗?

这是错误

来自“我的网站链接”的字体已被跨域资源共享策略阻止加载:请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:3001' 因此不允许访问

const app = express();

//
// Tell any CSS tooling (such as Material UI) to use all vendor prefixes if the
// user agent is not known.
// -----------------------------------------------------------------------------
global.navigator = global.navigator || {};
global.navigator.userAgent = global.navigator.userAgent || 'all';

//
// Register Node.js middleware
// -----------------------------------------------------------------------------
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

//
// Authentication
// -----------------------------------------------------------------------------
app.use(expressJwt({
  secret: auth.jwt.secret,
  credentialsRequired: false,
  getToken: req => req.cookies.id_token,
}));
app.use(passport.initialize());

app.get('/login/facebook',
  passport.authenticate('facebook', { scope: ['email', 'user_location'], session: false })
);
app.get('/login/facebook/return',
  passport.authenticate('facebook', { failureRedirect: '/login', session: false }),
  (req, res) => {
    const expiresIn = 60 * 60 * 24 * 180; // 180 days
    const token = jwt.sign(req.user, auth.jwt.secret, { expiresIn });
    res.cookie('id_token', token, { maxAge: 1000 * expiresIn, httpOnly: true });
    res.redirect('/');
  }
);

//
// Register API middleware
// -----------------------------------------------------------------------------
app.use('/graphql', expressGraphQL(req => ({
  schema,
  graphiql: true,
  rootValue: { request: req },
  pretty: process.env.NODE_ENV !== 'production',
})));

//
// Register server-side rendering middleware
// -----------------------------------------------------------------------------
app.get('*', async (req, res, next) => {
  try {
    let css = [];
    let statusCode = 200;
    const data = { title: '', description: '', style: '', script: assets.main.js, children: '' };

    await UniversalRouter.resolve(routes, {
      path: req.path,
      query: req.query,
      context: {
        insertCss: (...styles) => {
          styles.forEach(style => css.push(style._getCss())); // eslint-disable-line no-underscore-dangle, max-len
        },
        setTitle: value => (data.title = value),
        setMeta: (key, value) => (data[key] = value),
      },
      render(component, status = 200) {
        css = [];
        statusCode = status;
        data.children = ReactDOM.renderToString(component);
        data.style = css.join('');
        return true;
      },
    });

    const html = ReactDOM.renderToStaticMarkup(<Html {...data} />);

    res.status(statusCode);
    res.send(`<!doctype html>${html}`);
  } catch (err) {
    next(err);
  }
});

//
// Error handling
// -----------------------------------------------------------------------------
const pe = new PrettyError();
pe.skipNodeFiles();
pe.skipPackage('express');

app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars
  console.log(pe.render(err)); // eslint-disable-line no-console
  const statusCode = err.status || 500;
  const html = ReactDOM.renderToStaticMarkup(
    <Html
      title="Internal Server Error"
      description={err.message}
      style={errorPageStyle._getCss()}
      userAgent={req.headers['user-agent']}> // eslint-disable-line no-underscore-dangle
      {ReactDOM.renderToString(<ErrorPage error={err} />)}
    </Html>
  );
  res.status(statusCode);
  res.send(`<!doctype html>${html}`);
});

//
// Launch the server
// -----------------------------------------------------------------------------
/* eslint-disable no-console */
models.sync().catch(err => console.error(err.stack)).then(() => {
  app.listen(port, () => {
    console.log(`The server is running at http://localhost:${port}/`);
  });
});
/* eslint-enable no-console */

【问题讨论】:

标签: javascript express cors


【解决方案1】:

从 npm 安装 cors

npm install cors

并且,将其添加为中间件

app.use(cors());

祝你好运!

【讨论】:

    【解决方案2】:

    您可以插入标题,如下所示。这对我的项目有效,没有任何问题。

    // Where app -> const app = express(); 
    app.use(function(req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        next();
    });
    

    顺便说一下,您可以改进将路由逻辑与 app.js 分离的代码,并使用路由器:http://expressjs.com/es/api.html#router

    希望对你有帮助。

    【讨论】:

    • 我已经尝试添加代码,但我仍然得到同样的错误:(
    • @dczii 你能用你的 app.js 发表一个要点吗?
    • @dczii 我的表达方式可能不对,我需要你的 express.js 项目的 app.js。
    • 我使用 express.js 作为我的项目的模块,所以我没有编辑我的 expressjs 模块中的任何内容
    • @dczii express js 不是一个模块,而是一个完整的框架,另一方面,问题出现在您要请求字体的服务器上,所以应该有 cors 解决方案应用。该网站是否在您的管理之下?
    【解决方案3】:

    直接来自this 网站,关于在 express 中启用 CORS:

    app.use(function(req, res, next) {
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
      next();
    });
    
    app.get('/', function(req, res, next) {
      // Handle the get for this route
    });
    
    app.post('/', function(req, res, next) {
     // Handle the post for this route
    });
    

    【讨论】:

    • 您的答案的一个很好的改进是使用路由器而不是应用程序。
    • @Guillermo 感谢您的建议。听起来不错。任何可以帮助我了解更多信息的链接?或者你的意思是像 react-router 这样的东西?
    • 我已经尝试添加 app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access -Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); });但我仍然遇到同样的错误,在加载字体时,标题中仍然没有访问控制允许来源
    • @dczii 那行得通吗?您是否尝试过在该文件中的身份验证设置之前添加它,看看是否有帮助?
    猜你喜欢
    • 2018-10-18
    • 2017-07-21
    • 2016-06-27
    • 2016-03-24
    • 2018-04-12
    • 2020-01-21
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多