¿Cómo puedo apoyar cors cuando uso restify?

Tengo una API REST creada con el módulo de restauración y quiero permitir el intercambio de recursos de origen cruzado. ¿Cuál es la mejor manera de hacerlo?

Tienes que configurar el servidor para configurar encabezados de origen cruzado. No estoy seguro de si hay una función de uso integrada o no, así que escribí la mía.

server.use( function crossOrigin(req,res,next){ res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); return next(); } ); 

Encontré esto en este tutorial. http://backbonetutorials.com/nodejs-restify-mongodb-mongoose/

La última versión de Restify proporciona un complemento para manejar CORS .

Así que ahora puedes usarlo así:

 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'] })); 

Esto funciona para mí:

 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); }); 

Esto es lo que funcionó para mí:

 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); 

Yo este código fue tomado de https://github.com/mcavage/node-restify/issues/284

Para habilitar CORS para autenticación básica hice lo siguiente. No funcionó hasta que se usaron los métodos .use lugar de los métodos .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); 

El complemento CORS está en desuso en favor de https://github.com/Tabcorp/restify-cors-middleware . (Fuente: https://github.com/restify/node-restify/issues/1091 .)

A continuación se muestra un código de ejemplo sobre cómo usar

 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) 

Lo hago así en mi aplicación base de 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()); 

debe usar el método restify.CORS.ALLOW_HEADERS.push para empujar el encabezado que desea que restise primero, y luego usar el middleware CORS para iniciar la función CORS.

¡LA MAYORÍA DE LAS RESPUESTAS ANTERIORES SON DE 2013 Y UTILICE EJEMPLOS DEPRECADOS! La solución (al menos en 2017) es la siguiente:

 npm install restify-cors-middleware 

Luego en su servidor, el archivo 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); 

Y agregue cualquier otra opción adicional que funcione para usted. Mi caso de uso fue crear un proxy de host local para solucionar los problemas de CORS del navegador durante el desarrollo. Para su información, estoy usando Restify como mi servidor, pero luego mi POST del servidor (y al servidor) es con Axios. Mi preferencia allí.

npm listado para restify-cors-middleware

Si alguien se encuentra con esto a partir de febrero de 2018, parece que se ha introducido un error, no pude hacer que funcionara el restify-cors-middleware .

Estoy usando este trabajo alrededor por ahora:

 server.pre((req, res, next) => { res.header("Access-Control-Allow-Origin", "*"); next(); }); 

Esto bastó en mi caso:

 var server = restify.createServer(); server.use(restify.fullResponse()); server.get('/foo', respond(req, res, next) { res.send('bar'); next(); }); 

No fue necesario server.use(restify.CORS()); Además, parece que las llamadas a server.use() deben preceder a las llamadas a server.get() para que funcionen.