【问题标题】:CORS issue during routing in node js节点js中路由期间的CORS问题
【发布时间】:2018-01-18 07:47:38
【问题描述】:

我正在尝试将我的 Angular 应用程序连接到我的节点服务器,我不想将我的路由保留在服务器文件中,所以我有一个看起来像这样的节点服务器文件

    var express         = require('express');
    var path            = require('path');
    var bodyParser      = require('body-parser');
    var morgan          = require('morgan');  
    var app             = express();
    var router          = express.Router(); 
    var port            = process.env.PORT || 3000;
    var mongoose        = require('mongoose');
    var cors            = require('cors');

    app.use(cors())
    var db ='mongodb://localhost:27017/demo'  
    mongoose.connect(db,function(err){
      if(err){
        console.log("err");
      }
      else{
        console.log("coonected to db");
      }
    })


    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());
    app.use(morgan('dev'));


    app.set('views', path.join(__dirname,'views'));
    app.set('view engine','ejs');
    app.engine('html',require('ejs').renderFile);

    app.use(express.static(path.join(__dirname,'app')));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({extended:false}));

    app.get('/',function(req,res){
        console.log("you have reached server");
        res.json('wtf');
    })


    module.exports = app;
    require('./route.js');
    app.listen(port); 

在 route.js 我有这样的路线

    var login   = require ('./api/login');
    var app     = require('./server')
    app.get('/login',login.authenticate);

如果我在节点服务器上使用它可以正常工作,但如果我在角度服务器上使用它会显示此错误:

从“localhost:3000/login”重定向到“localhost:3000/login/”已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问 Origin 'localhost:4200'。

它只发生在我在route.js 中定义的路由上。如果我在server.js 中定义相同的路线,它们可以正常工作。

PS:我也用过

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", '*');
    res.header("Access-Control-Allow-Credentials", true);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header("Access-Control-Allow-Headers", 'Origin,X-Requested-With,Content-Type,Accept,content-type,application/json');
    next();
}); 

以及此代码的一些变体,但如果我想路由到我的路由文件中的登录 url,则没有任何效果

【问题讨论】:

  • 为什么要在 routes.js 中进行应用配置?
  • 我是节点新手,我想将路由保留在单独的模块中
  • 这很好,但这是您的 express 设置中的配置,可以将您的 express 相关配置保存在 server.js 中。但是,如果您可以在 routes.js 中添加用法,也许我们可以找到解决方案。
  • 没关系,我没有看到您的 routes.js 已经添加。现在告诉我,你认为 routes.js 中的 app 指的是 server.js 中的同一个东西吗?
  • 是的,我认为它们都是一样的

标签: javascript node.js angular cors


【解决方案1】:

您的应用程序在 routes.js 和 server.js 中引用的不是同一个东西。因此,您的“应用程序”将无法在 routes.js 中运行。如果你想在 routes.js 中使用 app = express() ,你可以在 server.js 中添加类似这样的内容

var Routes = require('./routes.js');
var r = new Routes(app);

所以为了像这样实例化路由,你的 routes.js 应该如下所示:

module.exports = function(app){
    var login   = require ('./api/login');
    app.get('/login',login.authenticate);
    ...
}

旧答案:

@Anurag Singh Bisht 也回答了您应该允许跨域请求。我的回答会略有不同:

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", '*');
    res.header("Access-Control-Allow-Credentials", true);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header("Access-Control-Allow-Headers", 'Origin,X-Requested-With,Content-Type,Accept,content-type,application/json');
    next();
});

【讨论】:

  • 感谢您的回答,但很抱歉此解决方案不起作用。
【解决方案2】:

您需要在您的服务器中allow cross origin,以便您的前端可以访问它。

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, Authorization");
  next();
});

【讨论】:

  • 我用过这个,但它显示相同的错误,但感谢您的帮助
【解决方案3】:

您需要添加以下代码来处理从浏览器发送的preflight 请求。

const cors = require('cors')
const corsOptions = {
  origin: '*'
}
app.use(cors(corsOptions))

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", '*');
    res.header("Access-Control-Allow-Credentials", true);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header("Access-Control-Allow-Headers", 'Origin,X-Requested-With,Content-Type,Accept,content-type,application/json');
    next();
});

【讨论】:

    猜你喜欢
    • 2016-07-15
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2016-10-05
    • 2014-02-28
    • 1970-01-01
    相关资源
    最近更新 更多