Node.js ';访问控制允许原点';登录时出现标题问题

Node.js ';访问控制允许原点';登录时出现标题问题,node.js,passport.js,Node.js,Passport.js,这是我在这个问题上挣扎的第三天 我得到这个错误: 请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”。响应的HTTP状态代码为502。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源 但是,当从同一服务器执行get请求时,我没有这样的问题。我故意破坏cors/headers设置,现在允许前端访问api,并发现问题在于登录。我尝试使用自己的api和axios执行post登录请求,但两次都失败了。在这一

这是我在这个问题上挣扎的第三天

我得到这个错误:

请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”。响应的HTTP状态代码为502。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源

但是,当从同一服务器执行get请求时,我没有这样的问题。我故意破坏cors/headers设置,现在允许前端访问api,并发现问题在于登录。我尝试使用自己的api和axios执行post登录请求,但两次都失败了。在这一点上,我不知道从哪里寻找问题。我的app.js api文件如下所示:

app.use(function (req, res, next) {
    var allowedOrigins = ['http://localhost:3000', 'front end'];
    var origin = req.headers.origin;

    if (allowedOrigins.indexOf(origin) > -1) {
        res.setHeader('Access-Control-Allow-Origin', 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', 'Authorization, Origin, X-Requested-With, Content-Type, Accept');
    next();
});
export const handleLogin = (email, password) => {
    return function (dispatch) {
        let params = { email, password };
        Api.post('/auth', params).then((res) => {
            //dispatch(fetchUser2());
            if(res.user){
                dispatch({
                    type: FETCH_USER,
                    payload: res.user
                })
            }
        });
    }
}
在前端登录如下所示:

app.use(function (req, res, next) {
    var allowedOrigins = ['http://localhost:3000', 'front end'];
    var origin = req.headers.origin;

    if (allowedOrigins.indexOf(origin) > -1) {
        res.setHeader('Access-Control-Allow-Origin', 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', 'Authorization, Origin, X-Requested-With, Content-Type, Accept');
    next();
});
export const handleLogin = (email, password) => {
    return function (dispatch) {
        let params = { email, password };
        Api.post('/auth', params).then((res) => {
            //dispatch(fetchUser2());
            if(res.user){
                dispatch({
                    type: FETCH_USER,
                    payload: res.user
                })
            }
        });
    }
}
但问题可能出在passport上,所以我也在粘贴passport文件:

module.exports = (passport) => {

  passport.serializeUser((user, done) => {
    done(null, user.id);
  });

  passport.deserializeUser((id, done) => {
    Employee.findById(id).then((user) => {
      done(null, user);
    });
  });

  //passport strategies
  passport.use('local', new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback: true,
  },
    function (req, email, password, done) {
      Employee.findOne({ email: email }, function (err, user) {
        if (err) { return done(err); }

        if (!user) {
          return done(null, false, { message: 'Incorrect username.' });
        }

        if (password != user.password) {
          return done(null, false, { message: 'Incorrect password.' });
        }
        return done(null, user);
      }).catch(errors => {
        return done(errors, null);
      })
    }
  ));
}
最后是api中的身份验证路由:

 app.post('/auth', function (req, res, next) {
        passport.authenticate('local', function (err, user, info) {
            if (err) {
                return next(err);
            }
            if (!user) {
                return res.status(401).send({
                    success: false,
                    msg: 'User not found'
                });
            }
            req.logIn(user, function (err) {
                if (err) {
                    return next(err);
                }
                res.status(200).send({
                    user: user,
                    msg: 'You're logged in'
                });
                return;
            });
        })(req, res, next);
    });

在尝试了伪post和get请求后,我几乎可以肯定它的passport是错误的,因为其他post请求也可以工作,因为您缺少
set
它应该是
setHeader

res.setHeader("Access-Control-Allow-Credentials", true);
res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Authorization, Origin, X-Requested-With, Content-Type, Accept');
编辑1

对于生产,您是否可以通过将其设置为:

res.setHeader('Access-Control-Allow-Origin', '*');

已经试过了,没什么区别。同样,当执行GET请求以检查当前登录的用户时,标题源代码工作正常。您是否尝试从
邮递员
点击API?哦,不,对不起,post请求不起作用,在本地它起作用,与生产APIOK不起作用,你能在这里发布请求头吗?@MazMat更新了允许全部的答案,你能检查一下吗?响应有HTTP状态代码502-这是你需要解决的问题,与你的CORS配置无关。这很可能表示某个服务器无法访问-因为防火墙或某个端口未打开,或者服务器甚至没有实际启动和运行,或者其他原因。@sideshowbarker这应该是答案。。