nodejs node log framework createserver node.js restify

node.js - node - ¿Cómo puedo apoyar cors cuando uso restify?



restify vs express (10)

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?


¡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 localhost para solucionar los problemas de CORS del navegador durante el desarrollo. Para mi 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


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)


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.


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 github.com/mcavage/node-restify/issues/284


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


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


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 utilizar 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.


Para habilitar CORS para la 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);


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


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/