Node.js 使用restify时如何支持cors
我有一个用restify模块创建的restapi,我想允许跨源资源共享。最好的方法是什么?您必须将服务器设置为设置跨源标题。不确定是否有内置函数,所以我写了自己的Node.js 使用restify时如何支持cors,node.js,cors,restify,Node.js,Cors,Restify,我有一个用restify模块创建的restapi,我想允许跨源资源共享。最好的方法是什么?您必须将服务器设置为设置跨源标题。不确定是否有内置函数,所以我写了自己的 server.use( function crossOrigin(req,res,next){ res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With")
server.use(
function crossOrigin(req,res,next){
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
return next();
}
);
我在本教程中找到了这个 最新版本的Restify提供了 因此,您现在可以这样使用它:
server.use(restify.CORS)({
//默认值为['*']。
来源:['https://foo.com', 'http://bar.com', 'http://baz.com:8081'],
//默认为false。
证书:正确,
//设置公开标题。
标题:['x-foo']
}));
这就是我的工作原理:
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);
我这段代码取自这在我的情况下就足够了:
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()调用之前才能工作 我在我的restify base应用程序上这样做:
//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功能。要启用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);
这对我很有用:
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);
});
CORS插件被弃用,取而代之的是。(来源:)
下面是关于如何使用的示例代码
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)
前面的大多数答案都来自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作为我的服务器,但是我从服务器(以及到服务器)的帖子是使用Axios的。我更喜欢那里
如果在2018年2月有人遇到这个问题,似乎有一个bug被引入,我无法让restify cors中间件
工作
我现在正在使用此工作方法:
server.pre((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
next();
});
这对我很有效这对我使用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();
});
我使用的是Restif7.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)
。。。这是一个暴力解决方案,不过您应该非常小心。有一个问题:哪个版本的restify?(你说的是“restify的最后一个版本……”@Jean MichelTrayaud:这对我不起作用。。。访问控制不允许我获取原点允许原点。任何帮助都将被感激:)我想我们需要更多的信息。。。第一次使用Restify 3.0.3测试GET或POST(POST对CORS来说真是一场噩梦),只使用resify.CORS()
就足够了。无需使用restify.fullResponse()
,但在请求中,需要指定Origin
头。请参阅中的相关代码注释。此插件有一个奇怪的行为。如果原点与数组中的一个匹配,它将在响应头中返回匹配的原点,这是预期的。但是,如果不匹配,它将返回一个通配符。如果您提出认证的cors请求,它仍然会失败,因为这样一来,原产地就不能是*。但为什么要返回*?这对我来说很有效,但我还需要添加server.use(restify.fullResponse())在(…)
上调用服务器之前,这几乎对我有效。我必须使用server.opts({path:'/customers',version:'0.0.1'},unknownMethodHandler)代码>。在
打开的情况下,该方法没有被调用。这避免了restify对选项飞行前请求的404“method not allowed”响应。CORS交叉源问题必须单独处理--请参阅“上面的crossOrigin函数解决了这个问题。我使用的是Restifv2.8.3,其中一些头文件在默认情况下已经启用。查看/node\u modules/restify/lib/plugins/cors.js
中的默认值。打字警告:最后一个需要额外的括号出于某种原因,其他答案对我不起作用。是你的。我想知道这是否与对最新版本的restify所做的更改有关。由于这个答案已经存在了一段时间,而且人们在下面的评论中询问有关版本的其他问题,我想报告,这个答案对我使用restify 4.1.0仍然有效。我使用的是restify 5.0.1,并且找不到关于CORSI的解决方案,请将其与6.0.1一起使用
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)
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`));