1

我正在从本地主机上的 chrome 应用程序对 node.js 后端发出 PUT。PUT 的内容最终通过 fs.writeFile 发送到磁盘,所以如果我看到文件被创建,我知道导致该创建的事件链,并且该链必须包含成功的 PUT。PUT 仅在成功的 OPTIONS 请求和我对该请求的响应之后发生。

在 chrome 调试器中,我始终为每个 PUT 看到以下内容:

XMLHttpRequest cannot load http://localhost:4000/home/bill/POS/Kitchen.130818.135938.002.T1. Origin chrome-extension://cenckmcibjncgjbokklgfkldnikknleb is not allowed by Access-Control-Allow-Origin. 

这是在根据调试器成功的 OPTIONS 请求之后。该 http 是我的 PUT 并指定最终保存到磁盘的文件名。该消息使它听起来像是一个 GET 操作。我知道它是一个 PUT 并且文件确实最终在磁盘上,所以我在 node.js 服务器中的 PUT 逻辑正在完成它的工作,我返回 200 状态。在调试器中,PUT 状态是“已取消”,就好像 OPTIONS 请求不允许它一样。这是不正确的。它显然已完成,否则我不会在磁盘上有文件。

这里有一个断开的地方。我想弄清楚在哪里。出了点问题,但我看不到。

以下是 node.js 服务器中的相关逻辑:

  case 'PUT':
     if (path.dirname(req.url) === systemPath) {
        buffer = '';
        req.on('data', function (data) {
           buffer += data;
        });
        req.on('end', function () {
           res.writeHead(200);
           res.end();
           fs.writeFile(req.url, buffer, function(error) {
              if (error) {throw error;}
           });
        });
     } else {
        console.log('Invalid Directory in URL - ' + req.url);
        res.writeHead(404);
        res.end('Invalid Directory in URL - ' + req.url);
     }
     break;
  case 'OPTIONS':
     res.writeHead(200, {'Access-Control-Allow-Methods': 'OPTIONS, TRACE, GET, HEAD, POST, PUT',
                         'Access-Control-Allow-Headers': 'content-type',
                         'Access-Control-Allow-Origin': '*'});
     res.end();
     break;
4

1 回答 1

0

为什么不完全放弃 CORS 并在清单中添加对 localhost 的权限?

此外,看看AJAX request failed 即使 CORS headers are present,它概述了似乎是一个非常相似的问题。

显然,来自 localhost 的 CORS 请求存在问题。也许有类似的问题来自 chrome-extension://...

对不起,我没有更明确的答案!

于 2013-08-19T07:52:15.990 回答