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í.
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/