2015-06-15 7 views
5

Come indicato nel titolo, la mia app di vele GET richiede una specifica funzione route/controller restituisce badRequest con JSON in un ambiente di sviluppo ma non in un prod ambiente. Perchè è questo?L'ambiente di produzione Sails.js non restituisce la risposta JSON su badRequest ma l'ambiente dev fa

Ecco la funzione di regolazione:

index: function(req, res) { 

    async.auto({ 

     companies: function(cb) { 

      User.findOneById(req.session.user.id) 
       .populate('companies') 
       .exec(function(err, user) 
      { 

       if(err) { 
        var badRequestData = { error: err }; 
        return cb(badRequestData, null); 
       } else if(user.companies.length == 0) { 
        var badRequestData = { error: "This user has no associated companies." }; 
        return cb(badRequestData, null); 
       } 

       cb(null, user.companies) 

      }); 

     }, 

     validateForNullCompanies: ['companies', function(cb, results) { 

      var nullCompanies = _.where(results.companies, { stripeAccountId: null }); 

      if(nullCompanies.length > 0) { 
       var badRequestData = { error: "This user needs to authenticate stripe with their company." }; 
       return cb(badRequestData, null); 
      } else { 
       return cb(); 
      } 

     }] 

    }, function(err, results) { 

     if (err) { 
      return res.badRequest(err); 
     } 

     return res.ok(); 

    }); 

}, 

risposta

6

Proprio urtato anche questo,

Se si guardano le note in http://sailsjs.org/documentation/reference/response-res/res-bad-request si dice

Per impostazione predefinita, l'errore specificato (err) sarà escluso se l'app è in esecuzione nell'ambiente di "produzione" (ad es. process.env.NODE_ENV === 'produzione').

E dare un'occhiata a api/responses/badRequest.js possiamo vedere il seguente codice:

// Only include errors in response if application environment 
// is not set to 'production'. In production, we shouldn't 
// send back any identifying information about errors. 
if (sails.config.environment === 'production') { 
    data = undefined; 
} 

Quindi, se si commento questo fuori, sono sicuro che otterrete il risultato desiderato in produzione. Allo stesso tempo, sembra essere qui per un motivo, quindi forse inviare codici di errore personalizzati con res.send([statusCode], body) dove body è il tuo JSON, o in alternativa creare una gestione lato client con una spiegazione meno descrittiva della cattiva richiesta.

+0

C'è un motivo per cui i messaggi di richiesta non validi devono essere esposti? Qual è la migliore pratica di esporre gli errori senza bypassare questo? –

+0

Questo è vecchio ma una risposta valida, quindi accetterò. – morcutt

2

Simile alla risposta fornita da finnergizer, se si controlla le api/risposte/badRequest.js, il codice vero e proprio dovrebbe essere come questo:

// Only include errors in response if application environment 
    // is not set to 'production'. In production, we shouldn't 
    // send back any identifying information about errors. 
    if (sails.config.environment === 'production' && sails.config.keepResponseErrors !== true) { 
    data = undefined; 
    } 

Il motivo già dichiarato nei commenti. Se pensi ancora di voler visualizzare il messaggio di errore nell'ambiente di produzione, invece di commentare questa riga, in realtà puoi aggiungere l'elemento 'keepResponseErrors' e impostarlo su true in config/env/production.js. In questo modo:

module.exports = { 
    keepResponseErrors: true 
}; 

In questo modo, non è necessario modificare tutti i file js di api/response.

Problemi correlati