繁体   English   中英

在Node.js中处理CORS

[英]Handling CORS in Node.js

我有两个应用程序,它们都在节点服务器的不同实例上运行,但是在同一台计算机上。

服务器的server.js

app.use(function(req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST', 'OPTIONS');
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization');

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
        console.log('Inside options');
      res.send(200);
    }
    else {
        console.log('Inside others');
      next();
    }
});

app.post('/signin', function(req, res) {
    console.log('signin called');
    User.findOne({email: req.body.email, password: req.body.password}, function(err, user) {
        if (err) {
            console.log('err');
            res.json({
                type: false,
                data: "Error occured: " + err
            });
        } else {
            if (user) {
                console.log('User exists');
                res.json({
                    type: false,
                    data: "User already exists!"
                });
            } else {
                console.log('inside create user');
                var userModel = new User();
                userModel.email = req.body.email;
                userModel.password = req.body.password;
                userModel.save(function(err, user) {
                    user.token = jwt.sign(user, process.env.JWT_SECRET);
                    user.save(function(err, user1) {
                        res.json({
                            type: true,
                            data: user1,
                            token: user1.token
                        });
                    });
                })
                console.log('create user ends');
            }
        }
    });
});

在客户端上, controller.js

    $scope.signup = function() {
                var formData = {
                    email: $scope.email,
                    password: $scope.password
                }

                Main.save(formData, function(res) {
                    console.log('response received from service');
                    if (res.type == false) {
                        alert(res.data)
                    } else {
                        $localStorage.token = res.data.token;
                        window.location = "/"    
                    }
                }, function() {
                    $rootScope.error = 'Failed to signup';
                })
            };

和服务:

    return {
                save: function(data, success, error) {
                    console.log('signin request sent');
                    $http.post(baseUrl + '/signin', data).success(success).error(error)
                    console.log('signin response received');
                },
                signin: function(data, success, error) {
                    $http.post(baseUrl + '/authenticate', data).success(success).error(error)
                },
                me: function(success, error) {
                    $http.get(baseUrl + '/me').success(success).error(error)
                },
                logout: function(success) {
                    changeUser({});
                    delete $localStorage.token;
                    success();
                }
            };

当我从客户端调用signup方法时,服务器控制台将输出以下内容:

Inside options
OPTIONS /signin 200 12.110 ms - 3
Inside others
signin called
inside create user
create user ends
POST /signin - - ms - -
Inside others
signin called
User exists
POST /signin 200 15.309 ms - 44

发生了什么情况,浏览器首先发送OPTIONS请求,并以200状态码响应,然后发送POST请求,该请求创建了用户,但客户端未获得响应。 浏览器会发送另一个具有相同数据的POST请求,但是到那时,已经创建了用户,服务器返回了一个用户已经存在的消息。

我找不到原因。

编辑:我根本不认为这是由于CORS。 我使用汽车包装,并在server.js的顶部添加了一个app.use(cos())。 之后,服务器控制台将打印-

签名在内部创建用户创建用户创建用户端POST /登录--ms--签名被称为用户存在POST /登录200 32.007 ms-44

我认为服务器端有些卡住,因此客户端再次发送了请求。

有些防火墙会部分阻止CORS,最佳做法是通过https使用CORS

我猜问题出在标题上。 在进行POST调用时,请添加以下标头:

'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'

我曾经有过类似的问题,并且在POST调用中添加了此标头后才解决。

希望这有效:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM