Javascript 在节点js中路由期间的CORS问题

Javascript 在节点js中路由期间的CORS问题,javascript,node.js,angular,cors,Javascript,Node.js,Angular,Cors,我正在尝试将我的angular应用程序连接到我的节点服务器,我不想将我的路由保存在服务器文件中,所以我有一个节点服务器文件,如下所示 var express = require('express'); var path = require('path'); var bodyParser = require('body-parser'); var morgan = require('morgan');

我正在尝试将我的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);
如果我在节点服务器上使用它,它可以正常工作,但如果我在angular服务器上使用它,它会显示以下错误:

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

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

附言:我也用过

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,则什么都不起作用。您需要
在服务器中允许跨源
,以便您的前端可以访问它

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();
});

您需要在服务器中
允许跨源
,以便前端可以访问它

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();
});

routes.js和server.js中的应用程序引用的内容不同。因此,您的“应用程序”在routes.js中无法工作。如果要在routes.js中使用app=express(),可以在server.js中添加类似的内容

var Routes = require('./routes.js');
var r = new Routes(app);
因此,为了像这样实例化routes,您的routes.js应该如下所示:

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

正如您所回答的,您应该允许跨域请求。我的答案会略有不同:

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();
});

routes.js和server.js中的应用程序引用的内容不同。因此,您的“应用程序”在routes.js中无法工作。如果要在routes.js中使用app=express(),可以在server.js中添加类似的内容

var Routes = require('./routes.js');
var r = new Routes(app);
因此,为了像这样实例化routes,您的routes.js应该如下所示:

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

正如您所回答的,您应该允许跨域请求。我的答案会略有不同:

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();
});

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

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();
});

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

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();
});

我用过这个,但是它显示了相同的错误,但是谢谢你的帮助我用过这个,但是它显示了相同的错误,但是谢谢你的帮助,谢谢你的回答,但是很抱歉这个解决方案不起作用。谢谢你的回答,但是很抱歉这个解决方案不起作用。为什么你要在routes.js内进行应用程序配置?我是node的新手,我想将路由保留在单独的模块中这很好,但这是express设置中的配置,将与express相关的配置保留在server.js中也很好。但是,如果你可以在routes.js中添加用法,也许我们可以找到一个解决方案。现在告诉我,你认为routes.js中的应用程序与server.js中的相同吗?是的,我认为它们都是相同的。为什么你要在routes.js中进行应用程序配置?我是node的新手,我想将路由保留在单独的模块中这很好,但这是express设置中的配置,在server.js中保留与express相关的配置是可以的。但是,如果你可以在routes.js中添加用法,也许我们可以找到一个解决方案。现在告诉我,你认为routes.js中的应用程序在server.js中指的是相同的东西吗?是的,我认为它们都是相同的