javascript - CORS 政策 : No 'Access-Control-Allow-Origin' /500 (Internal Server Error) Problem

标签 javascript vue.js sequelize.js body-parser

基本上,我试图通过 id 从 Sequelize 获取用户名。问题是我要么遇到 CORS 问题,要么遇到 500 内部服务器错误,具体取决于响应(状态)

cors and 500

Controller 代码

    async getUserFromUserId (req, res) {
        try {
            // const user = await User.findByPk(req.body.id)
            const id = req.body.id
            const user = await User.findByPk(id)
            res.send(user.username)
            } catch (err) {

            // or res.status(some random number).send() for CORS problem to appear

            res.status(500).send({
                error: 'an error has occured trying to fetch the users id'
            })
        }
    },


客户代码
this.notifiedUser = (await UserService.getUserFromUserId({id: UserId})).data

我从 postman 那里得到了一个状态:200 OK。
Postman Solution

编辑:
我已经看到 cors 的其他 Solution 是如何处理的,但是解决方案没有说明为什么在解决 cors 问题后我得到“未定义”的结果。

最佳答案

因此,CORS 在这方面实际上非常令人讨厌,但是有一种相当简单的方法可以解决此问题。这是一个 super 有用的安全功能,尽管有时充其量令人沮丧。

您的浏览器执行所谓的预检请求,它是 http 动词 OPTIONS 。您的浏览器会调用您想要的任何路由,但不是您要求它执行的操作,而是首先使用 OPTIONS 进行调用。您的服务器应该接受客户端可以使用 OPTIONS 方法请求的所有路由,并且您的服务器应该使用以下 header 作为外部可用的跨域 API 进行响应。

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, ...

(注意,您不应将 ... 放入,但您可以将任何 HTTP 动词放入此列表中)

如果您需要自己的 header (用于身份验证),您需要为客户端 -> 服务器添加此 header 。
Access-Control-Allow-Headers: YourHeader, YourHeader2, YourHeader3

您想为 Server -> Client 添加这个
Access-Control-Expose-Headers: YourHeader,YourHeader3

请注意,OPTIONS 调用是一个完全独立的调用,您应该像 GET 方法一样处理它。

你现在已经告诉浏览器它可以请求什么,以及它可以从你的 API 得到什么。如果不响应 OPTIONS 请求,浏览器会终止该请求,从而导致 CORS 错误。

我将猜测一下,并假设您可能使用 Express,其中 this answer 描述了如何设置标题。

英文标题是什么意思?
Access-Control-Allow-Origin允许客户端从何处访问此资源(端点)?这可以将部分域与通配符匹配,或者只是一个 * 以允许任何地方。
Access-Control-Allow-Methods此路由允许使用哪些 HTTP 方法?
Access-Control-Expose-Headers当我从服务器得到响应时,我(浏览器)应该向客户端公开什么?
Access-Control-Allow-Headers作为客户端,我可以作为 header 发送什么?

关于javascript - CORS 政策 : No 'Access-Control-Allow-Origin' /500 (Internal Server Error) Problem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55445898/

相关文章:

javascript - 单引号内Javascript双引号的字符串问题

javascript - NuxtJS 无法使用变量加载多个 CSS 表

javascript - 手动输入时会复制值,但单击时不会自动复制

javascript - 在 Canvas 中绘制平铺 map

javascript - 如何随时间动态更改html中<label>的颜色

node.js - 锁定 postgres 事务

node.js - 带有 where 参数的 Sequelize findAll() 返回 null,而 findByPk() 返回正确的数据

vue.js - 如何在 Vue js 组件中使用 Electron API?

javascript - 如何在 Vuejs 中停止执行直到 get 请求完成

javascript - 模型包含选项将属性作为具有定义别名的单个值而不是具有属性的对象返回