我有一个静态AngularJS网站和一个运行在不同域上的Express服务器。该站点以文件名作为参数将GET请求发送到服务器。然后,服务器从S3存储桶中请求文件,该文件以“ binary / octet-stream”作为“ Content-Type”发送。它解密数据,然后使用相同的“ Content-Type”将其发送回站点,然后下载文件。对于单个文件请求,这一切都很好,但是我希望能够一次向服务器发送一个文件名数组,然后能够下载多个文件。我尝试将文件名作为JSON数组发送,但出现错误:
XMLHttpRequest无法加载http:// localhost:3000 / decrypt。对预检请求的响应未通过访问控制检查:在所请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访问原始文件“ file://”。
在我的服务器控制台中,该请求显示为OPTIONS而不是POST。我还确保Access-Control-Allow-Origin: *
在响应标头中包含该标头。我应该如何解决这个问题?
更新:
通过在路由器上添加以下中间件,我能够解决CORS错误:
function allowCrossDomain(req, res, next) {
if ('OPTIONS' == req.method) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
res.status(200).end();
}
else {
next();
}
}
但是,我仍然不确定如何在响应中发送多个(每个文件)“ binary / octet-stream”,并将其作为文件下载到静态站点上。目前,我正在使用angular-file-saver保存单个请求中的文件。
您需要在服务器中做几件事。首先您使用multer
与bodyParser
?Multer
将允许您添加来电,并为您处理数据传递。
AngularJS的第一篇文章:
$http.post(baseUrl + "mypostmethod", o) //o is your object
.then(function successCallback(resp) {
console.log(resp)
}, function errorCallback(resp) {
console.log(resp)
});
现在,对于您的nodejs express
设置,您要确保使用了所有正确的模块。我将提供我在大多数项目中使用的基本列表。同样,如果您使用req.headers.origin
*而不是*,则不会再收到该Access-Control-Allow-Origin
错误。
NodeJS:
var express = require('express'),
fs = require('fs'),
spdy = require('spdy'),
bodyParser = require('body-parser'),
multer = require('multer'),
helmet = require('helmet'),
upload = multer(), // this will allow you to pass your object into your post call with express
path = require('path'),
cookieParser = require('cookie-parser'),
request = require('request'),
app = express(),
http = require('http'),
formidable = require('formidable'); //Good for handling file uploads
app.use(helmet());
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH');
res.header('Access-Control-Allow-Headers', 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version');
next();
});
这些是我几乎所有程序中都使用的基本程序。最重要的express
是bodyParser
,multer
因为这些使您可以正确使用gets和post。
这是一个发布NodeJS的示例:
app.post('/mypostmethod', upload.array(), function(req, res) {
var body = req.body,
sess = req.session;
res.send({
Status: "Success"
});
});
在这篇文章中,当您使用时upload.array()
,它正在利用multer
,现在req.body
是您通过角度发布调用传递的对象。
让我知道您是否有任何问题,希望对您有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句