2014-05-07 1 views
7

Sono nuovo di Sails e sto cercando di capire il metodo migliore/corretto per la restituzione di un oggetto standard per ogni risposta API.Come posso avvolgere ogni risposta dell'API in un oggetto di risposta standard in SailsJS?

Il contenitore nostro front-end richiede è:

{ 
    "success": true/false, 
    "session": true/false, 
    "errors": [], 
    "payload": [] 
} 

Attualmente, sto sovrascrivendo le azioni blueprint in ogni controller come in questo esempio (che ha appena sembra così molto, molto sbagliato):

find : function(req, res){ 

    var id = req.param('id'); 

    Foo.findOne({ id : id }).exec(function(err, aFoo){ 

     res.json(
     AppSvc.jsonReply(
      req, 
      [], 
      aFoo 
     ), 200 
    ); 
    }); 

    } 

E in AppSvc.js:

jsonReply : function(req, errors, data){ 

    return { 
     success : (errors && errors.length ? false : true), 
     session : (req.session.authenticated === true), 
     errors : (errors && errors.length ? errors : []), 
     payload : (data ? data : []) 
    }; 

    } 

Inoltre, ho avuto di mod ogni metodo res.json() per ogni risposta predefinita (badRequest, notFound, ecc.). Di nuovo, questo sembra così sbagliato.

Quindi, come posso incanalare correttamente tutte le risposte API in un contenitore standard?

risposta

6

Le risposte personalizzate per le vele sono ottime per questo.

Se si guarda il codice progetto, vedrete che ognuno chiama res.ok quando è fatto: https://github.com/balderdashy/sails/blob/master/lib/hooks/blueprints/actions/find.js#L63

È possibile aggiungere un tuo file - ok.js - API/risposte/- che sostituirà il gestore integrato predefinito.

https://github.com/balderdashy/sails/blob/master/lib/hooks/responses/defaults/ok.js < - basta copiare e incollare questo per iniziare e adattarsi come necessario.

+0

È anche possibile sovrascrivere il metodo 'find' del progetto globale utilizzando un file' api/blueprints/find.js'! – sgress454

+1

Questo è stato perfetto. Ho sovrascritto le chiamate 'res.json()' in tutti i file api/responses/* per usare il mio contenitore 'AppSvc.jsonReply'. All'interno dei miei controller posso ora eseguire il solito 'res.ok (data);', 'res.notFound();', ecc. Grazie Rob! – NotJustClarkKent