如何在不使用Express的情况下使用Node.js允许CORS

32

我尝试了其他问题的答案,并使用了(从https://gist.github.com/balupton/3696140更新):


var http = require('http');
var cors = require('cors');

http.createServer(app).listen(3000).use();

function app(request, response) {

response.setHeader('Access-Control-Allow-Origin', '*');
response.setHeader('Access-Control-Request-Method', '*');
response.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET');
response.setHeader('Access-Control-Allow-Headers', '*');

...

}

它返回:http.createServer(...).listen(...).use 不是一个函数

更新后,它可以运行,但我在客户端仍然收到 405 错误。


你做错了。 - Jaromanda X
你还是会得到相同的错误,因为你仍然使用 http.createServer(app).listen(3000).use(cors()); ... 傻瓜 - Jaromanda X
@JaromandaX 哦,我这里只是没有更新。现在我遇到了405错误。 - Aero Wang
展示客户端请求中的问题。 - Jaromanda X
FYI - 服务器不需要发送 Access-Control-Request-Method - 这是预检客户端请求标头的一部分 - 是的,我知道你链接的东西会发出该标头,但是,如果你想了解CORS,请从可靠的文档中学习 - 而不是从互联网上的其他傻瓜:p - Jaromanda X
显示剩余2条评论
4个回答

47
这里有一个详细的答案,可以在没有插件的情况下添加CORS:代码来自这里。请阅读关于CORS安全性的内容这里
const http = require('http');
const port = 8080;

http.createServer((req, res) => {
  const headers = {
    'Access-Control-Allow-Origin': '*', /* @dev First, read about security */
    'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',
    'Access-Control-Max-Age': 2592000, // 30 days
    /** add other headers as per requirement */
  };

  if (req.method === 'OPTIONS') {
    res.writeHead(204, headers);
    res.end();
    return;
  }

  if (['GET', 'POST'].indexOf(req.method) > -1) {
    res.writeHead(200, headers);
    res.end('Hello World');
    return;
  }

  res.writeHead(405, headers);
  res.end(`${req.method} is not allowed for the request.`);
}).listen(port);

// You can also set using the following method
res.setHeader('Access-Control-Allow-Origin', '*'); /* @dev First, read about security */
res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET');
res.setHeader('Access-Control-Max-Age', 2592000); // 30 days
res.setHeader('Access-Control-Allow-Headers', 'content-type'); // Might be helpful

直到我加入'''res.setHeader('Access-Control-Allow-Headers', req.header.origin);'''才使它对我起作用,根据这个链接:https://gist.github.com/balupton/3696140 '*'不允许用于Access-Control-Allow-Headers头。 - Akseli Arvaja
我还必须添加res.setHeader('Access-Control-Allow-Headers', 'content-type');。有些请求似乎受到更严格的控制。 - undefined
1
更新 @treejanitor - undefined

11

现在不需要将它传递给.writeHead(),你可以使用:

response.setHeader('Access-Control-Allow-Origin', '*');
response.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET');
response.setHeader('Access-Control-Max-Age', 2592000); // 30 days

6
你不想使用Express,但仍想使用它的中间件机制。
如果
var server = http.createServer(app).listen(3000)

如果服务器没有 .use 函数,那么 cors 模块就被设计为中间件,这意味着您需要使用 Express/Connect 才能使用它。
您可以继续不使用 expressjs,并找到不同于使用 cors 的方法,例如在此处查看:https://gist.github.com/balupton/3696140

2
对于那些四处寻找并想知道为什么他们的手动解决方案仍然不起作用的人:链接的Gist最终有效,因为它在预检响应和实际响应上都返回了CORS头。 - Gabriel Garrett

5
这是因为您正在请求一个不太简单的请求,这意味着它需要处理预检请求,该请求是作为 HTTP OPTIONS 请求进行的(所以请确保您的服务器能够响应此方法)。预检请求是在实际请求之前请求权限的一种方式。服务器应检查上述两个头部,以验证 HTTP 方法和请求头是否有效且被接受。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接