我正在从本地主机上的 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;