【发布时间】:2021-03-04 21:34:55
【问题描述】:
使用以下代码时:
服务器:
const cors = require('cors')
const mongoose = require('mongoose');
const Pet = mongoose.model('pets');
const corsOptions = {
origin: 'http://localhost:3000'}
app.get(`/api/pets`, cors(corsOptions), async (req, res) => {
let pets = await Pet.find();
return res.status(200).send(pets);
});
app.post(`/api/pets`, cors(corsOptions), async (req, res) => {
let pet = await Pet.create(req.body);
return res.status(201).send({
error: false,
pet
})
})
客户:
import axios from 'axios';
export default {
getAll: async () => {
let res = await axios.get(`http://localhost:5000/api/pets`);
return res.data || [];
},
post: async (name, birthdate, decription) => {
let res = await axios.post(`http://localhost:5000/api/pets`, {
name: name,
birthdate: birthdate,
description: decription
});
return res;
},
...
}
客户端可以正常访问 .get 路由,但是当它尝试 .post 时出现以下错误:
“从源“http://localhost:3000”访问“http://localhost:5000/api/test”的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查: 请求的资源上不存在“Access-Control-Allow-Origin”标头。”
但是,这将允许 .post 路由正常工作:
服务器:
const cors = require('cors')
...
const corsOptions = {
origin: 'http://localhost:3000'}
app.use(cors(corsOptions));
app.get(`/api/pets`, async (req, res) => {
...
});
app.post(`/api/pets`, async (req, res) => {
...
})
这两种方法有什么区别,为什么使用“app.use(...)”允许 .post 路由工作,而另一个不能工作?
【问题讨论】:
-
您的 POST 请求中可能有一些东西触发了您没有处理程序的飞行前请求(OPTIONS 请求)。如果您希望我们帮助您,我们需要查看 POST 请求的确切内容,包括内容类型和自定义标头。
-
我已经编辑了帖子以包含我所拥有的内容,并且我还添加了客户端的内容。 “宠物”是猫鼬模型
-
您是否有任何具体原因希望仅在某些 URL 上使用 CORS 而在其他 URL 上不使用?
-
因为我只希望它接受来自该 URL 的请求。我希望有一天能部署它,我希望它至少有一些安全性
-
我们需要查看从客户端发送请求的完整代码或实际的 POST 请求(包括所有标头)。正如我上面所说,我怀疑你在 POST 请求中有一些东西会触发你没有处理程序的 CORS 预检。但是,只看到代码的外壳而没有实际查看请求本身意味着我们无法确定。请求上的某些内容类型或某些标头可以触发预检。仅供参考,如果您查看 Chrome 调试器中的网络选项卡,您可以确切地看到正在发生的事情。我们现在都瞎了眼。
标签: javascript node.js express http cors