node.js - restify errors




Come posso supportare cors quando si usa Restify (7)

Ho una API REST creata con il modulo restify e voglio consentire la condivisione delle risorse tra origini. Qual'è il miglior modo di farlo?


È necessario impostare il server fino a impostare le intestazioni di origine incrociata. Non sono sicuro se ci sia una funzione incorporata o meno, quindi ho scritto la mia.

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

Ho trovato questo da questo tutorial. http://backbonetutorials.com/nodejs-restify-mongodb-mongoose/


Il plugin CORS è obsoleto a favore di https://github.com/Tabcorp/restify-cors-middleware . (Fonte: https://github.com/restify/node-restify/issues/1091 .)

Di seguito è riportato un codice di esempio su come utilizzare

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)

LA MAGGIOR PARTE DELLE PRECEDENTI RISPOSTE SONO DAL 2013 E USANO ESEMPI DEPRECATI! La soluzione (almeno nel 2017) è la seguente:

npm install restify-cors-middleware

Quindi nel file javascript del tuo server:

var corsMiddleware = require('restify-cors-middleware');

var cors = corsMiddleware({
  preflightMaxAge: 5,
  origins: ['*']
});

var server = restify.createServer();

server.pre(cors.preflight);
server.use(cors.actual);

E aggiungi qualsiasi altra opzione aggiuntiva che funzioni per te. Il mio caso d'uso era la creazione di un proxy localhost per aggirare i problemi CORS del browser durante lo sviluppo. FYI Sto usando Restify come mio server, ma poi il mio POST dal server (e al server) è con Axios. La mia preferenza lì.

elenco npm per restify-cors-middleware


Lo faccio in questo modo sulla mia app 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());

è necessario utilizzare il metodo restify.CORS.ALLOW_HEADERS.push per spingere prima l'intestazione che si desidera ripristinare, quindi utilizzare il middleware CORS per avviare la funzione CORS.


Questo è ciò che ha funzionato per me:

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

Questo codice è stato preso da github.com/mcavage/node-restify/issues/284


Questo era sufficiente nel mio caso:

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

Non era necessario server.use(restify.CORS()); Inoltre, sembra che le chiamate server.use() debbano precedere le chiamate server.get() per funzionare.


Se qualcuno si imbatte in questo restify-cors-middleware partire da febbraio 2018 sembra che ci sia un bug che è stato introdotto, non ho potuto ottenere il restify-cors-middleware per funzionare.

Sto usando questo lavoro in giro per ora:

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






restify