【问题标题】:CORS headers issue express AngularCORS 标头问题表达 Angular
【发布时间】:2021-02-27 07:34:56
【问题描述】:

在开发中这工作正常,我最近更新了我的 vps 中的代码,我在控制台中收到错误:从源 'https 访问 'https://www.example.con/api/register' 处的 XMLHttpRequest ://example.com' 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。 我试过了:

app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Authorization, X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Request-Method');
    res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
    res.header('Allow', 'GET, POST, OPTIONS, PUT, DELETE');
    next();
});
和:app.use(cors());但我在控制台中仍然有相同的消息。
  noAuthHeader = { headers: new HttpHeaders({ 'NoAuth': 'True' }) };
  
    postUser(user: User){
    return this.http.post(this.url + '/register', user, this.noAuthHeader);
  }

    register: (req, res, next) => {
        let user = new User();
        user.email = req.body.email;
        user.password = req.body.password;
        user.domain = req.body.domain;
    
        user.save((err, doc) => {
            if (!err)
                res.send(doc);
            else {
                if (err.code == 11000) {
                    if(err.keyValue.hasOwnProperty('domain')){
                        res.status(422).send(['Name repeated']);
                    }
                    if(err.keyValue.hasOwnProperty('email')){
                        res.status(422).send(['Email repeated']);
                    }               
                } else {
                    return next(err);
                }
            }
        });
    },

我在代码中所做的修改是 register() api 中的验证。我正在使用 mongo DB 并检查错误代码 11000 以获取 DB(电子邮件和域字段)中重复的唯一模型数据。当我尝试注册重复的电子邮件或域时,控制台会引发 CORS 错误。

编辑: 我在控制台中收到此错误:

/home/myapp_full/myapp_v0.2/node_modules/mongoose/lib/helpers/promiseOrCallback.js:19 抛出错误; ^ TypeError:无法读取未定义的属性“hasOwnProperty”。

【问题讨论】:

  • 在我更新之前代码似乎可以正常工作,除此之外我还添加了 recaptcha 以避免机器人注册
  • 我也在客户端中添加了更改,以处理 recaptcha 密钥,并且只禁用提交按钮,但如果我创建一个新的“不重复”用户,这工作正常,问题是当我尝试注册一个注册用户
  • 不,我用 recaptchaService 发送令牌:sendToken(token){ return this._http.post(this.url + "/recaptcha-validate", {recaptcha: token}) }然后等待验证,然后向 api 发送 register() 请求
  • 老实说 noAuthHeader 我只是复制代码 sn-p 使注册工作
  • example.com 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。

标签: javascript node.js mongodb express cors


【解决方案1】:

我认为你不需要 CORS,除非你真的打算拥有两个独立的网站:www.example.comexample.com

如果您的服务器设置为接受来自两者的请求并且不重定向,我建议您尽可能在代码中处理重定向,以便选择一个规范 URL:example.comwww.example.com。除此之外,只要两台服务器上都存在脚本,只需加载不带 URL 的脚本(又名 "/register",而不是 this.url + "/register"

【讨论】:

    【解决方案2】:

    有一次我在使用 Angular 时遇到了同样的问题,我解决了它,删除了后端的 CORS 标头。我希望这对你有用。

    【讨论】:

    • 不确定如何在您自己的后端删除 CORS 标头会修复由于缺少 CORS 标头而导致的错误
    • 我认为它起作用了,因为我使用的主机不需要它
    • 显然是 OP,因为错误是 没有 'Access-Control-Allow-Origin' 标头存在,因此,没有导致问题的 CORS 标头
    【解决方案3】:

    已解决:似乎 Linux 和 Windows 会抛出不同的错误消息,我修改了这段代码,它工作正常,无论如何响应只是“电子邮件或名称重复”,我想处理每个唯一数据,我我还在等待升级,感谢您的宝贵时间。

     user.save((err, doc) => {
                if (!err)
                    res.send(doc);
                else {
                    if (err.code == 11000) {
                            res.status(422).send(['Email or name repeated']);
                
                    } else {
                        return next(err);
                    }
                }
            });

    【讨论】: