我与的RESTify模块创建一个REST API,我想允许跨域资源共享。 什么是做到这一点的最好方法是什么?
Answer 1:
你必须设置服务器最多设置跨原产头。 不知道是否有一个内置的使用功能或没有,所以我写我自己。
server.use(
function crossOrigin(req,res,next){
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
return next();
}
);
我发现这本教程。 http://backbonetutorials.com/nodejs-restify-mongodb-mongoose/
Answer 2:
的RESTify的最新版本提供了一个插件来处理CORS 。
所以,你现在可以使用这样的:
server.use(restify.CORS({
// Defaults to ['*'].
origins: ['https://foo.com', 'http://bar.com', 'http://baz.com:8081'],
// Defaults to false.
credentials: true,
// Sets expose-headers.
headers: ['x-foo']
}));
Answer 3:
这对我的作品:
var restify = require('restify');
var server = restify.createServer();
server.use(restify.CORS());
server.opts(/.*/, function (req,res,next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", req.header("Access-Control-Request-Method"));
res.header("Access-Control-Allow-Headers", req.header("Access-Control-Request-Headers"));
res.send(200);
return next();
});
server.get('/test', function (req,res,next) {
res.send({
status: "ok"
});
return next();
});
server.listen(3000, function () {
console.log('%s listening at %s', server.name, server.url);
});
Answer 4:
这是对我工作:
function unknownMethodHandler(req, res) {
if (req.method.toLowerCase() === 'options') {
console.log('received an options method request');
var allowHeaders = ['Accept', 'Accept-Version', 'Content-Type', 'Api-Version', 'Origin', 'X-Requested-With']; // added Origin & X-Requested-With
if (res.methods.indexOf('OPTIONS') === -1) res.methods.push('OPTIONS');
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Headers', allowHeaders.join(', '));
res.header('Access-Control-Allow-Methods', res.methods.join(', '));
res.header('Access-Control-Allow-Origin', req.headers.origin);
return res.send(204);
}
else
return res.send(new restify.MethodNotAllowedError());
}
server.on('MethodNotAllowed', unknownMethodHandler);
我这个代码是取自https://github.com/mcavage/node-restify/issues/284
Answer 5:
CORS插件是赞成不赞成的https://github.com/Tabcorp/restify-cors-middleware 。 (来源: https://github.com/restify/node-restify/issues/1091 。)
下面是关于如何使用示例代码
const corsMiddleware = require('restify-cors-middleware')
const cors = corsMiddleware({
preflightMaxAge: 5, //Optional
origins: ['http://api.myapp.com', 'http://web.myapp.com'],
allowHeaders: ['API-Token'],
exposeHeaders: ['API-Token-Expiry']
})
server.pre(cors.preflight)
server.use(cors.actual)
Answer 6:
要启用基本身份验证CORS我做了以下。 它没有工作,直到.pre
方法,替代了的.use
方法
server.pre(restify.CORS({
origins: ['https://www.allowedip.com'], // defaults to ['*']
credentials: true,
headers: ['X-Requested-With', 'Authorization']
}));
server.pre(restify.fullResponse());
function unknownMethodHandler(req, res) {
if (req.method.toLowerCase() === 'options') {
var allowHeaders = ['Accept', 'Accept-Version', 'Content-Type', 'Api-Version', 'Origin', 'X-Requested-With', 'Authorization']; // added Origin & X-Requested-With & **Authorization**
if (res.methods.indexOf('OPTIONS') === -1) res.methods.push('OPTIONS');
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Headers', allowHeaders.join(', '));
res.header('Access-Control-Allow-Methods', res.methods.join(', '));
res.header('Access-Control-Allow-Origin', req.headers.origin);
return res.send(200);
} else {
return res.send(new restify.MethodNotAllowedError());
}
}
server.on('MethodNotAllowed', unknownMethodHandler);
Answer 7:
如果有人遇到这是2018年2月的似乎是已被引入的错误,我不能得到restify-cors-middleware
工作。
我使用此解决现在:
server.pre((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
next();
});
Answer 8:
我不喜欢这样对我的RESTify基础的应用程序:
//setup cors
restify.CORS.ALLOW_HEADERS.push('accept');
restify.CORS.ALLOW_HEADERS.push('sid');
restify.CORS.ALLOW_HEADERS.push('lang');
restify.CORS.ALLOW_HEADERS.push('origin');
restify.CORS.ALLOW_HEADERS.push('withcredentials');
restify.CORS.ALLOW_HEADERS.push('x-requested-with');
server.use(restify.CORS());
你需要使用restify.CORS.ALLOW_HEADERS.push方法推ü想进入的RESTify第一头部,然后使用CORS中间件引导CORS功能。
Answer 9:
大部分以前的答案是从2013年和使用已停用的例子! 将该溶液(在2017年至少)如下:
npm install restify-cors-middleware
然后在你的服务器的JavaScript文件:
var corsMiddleware = require('restify-cors-middleware');
var cors = corsMiddleware({
preflightMaxAge: 5,
origins: ['*']
});
var server = restify.createServer();
server.pre(cors.preflight);
server.use(cors.actual);
并添加任何额外的其他选项为你工作。 我用例是创建一个本地主机代理发轫探索过程中绕过浏览器CORS问题。 仅供参考我使用的RESTify作为我的服务器,但后来我的帖子从服务器(和服务器)是爱可信。 我偏爱有。
NPM清单的RESTify-CORS中间件
Answer 10:
这足以在我的情况:
var server = restify.createServer();
server.use(restify.fullResponse());
server.get('/foo', respond(req, res, next) {
res.send('bar');
next();
});
这是没有必要server.use(restify.CORS());
此外,它似乎server.use()
调用必须先server.get()
调用才能工作。
Answer 11:
这个工作对我的RESTify 7
server.pre((req, res, next) => {
res.header('Access-Control-Allow-Origin', req.header('origin'));
res.header('Access-Control-Allow-Headers', req.header('Access-Control-Request-Headers'));
res.header('Access-Control-Allow-Credentials', 'true');
// other headers go here..
if(req.method === 'OPTIONS') // if is preflight(OPTIONS) then response status 204(NO CONTENT)
return res.send(204);
next();
});
Answer 12:
我使用的RESTify 7.2.3版本,该代码为我工作得非常好。 您需要安装的RESTify-CORS中间件插件。
const corsMiddleware = require('restify-cors-middleware')
const cors = corsMiddleware({
preflightMaxAge: 5, //Optional
origins: ['http://ronnie.botsnbytes.com', 'http://web.myapp.com'],
allowHeaders: ['API-Token'],
exposeHeaders: ['API-Token-Expiry']
})
server.pre(cors.preflight)
server.use(cors.actual)
Answer 13:
const cors = require('cors');
const server = restify.createServer();
server.use(cors());
这为我工作
Answer 14:
const restify = require('restify');
const corsMiddleware = require('restify-cors-middleware');
const cors = corsMiddleware({
origins: ['*']
});
const server = restify.createServer();
server.pre(cors.preflight);
server.use(cors.actual);
server.get('/api/products', (request, response) => {
response.json({ message: 'hello REST API' });
});
server.listen(3000, () => console.info(`port 3000`));
...是一个蛮力解决方案,但你应该非常小心这样做。