In Node.js, dovrei usare gli errori per il controllo di flusso, o dovrei li uso più come eccezioni?Best practice NodeJS: errori per il controllo del flusso?
sto scrivendo un controller di autenticazione e di alcuni test di unità in Sails.js, e attualmente, i miei assegni metodo di registrazione per vedere se un utente con lo stesso nome utente esiste. Se un utente è già esistente con il nome utente, il mio metodo modello chiama i suoi argomenti di callback con un nuovo oggetto Error, in questo modo:
Modello:
exists: function (options, cb) {
User.findOne({
where: { username: typeof options === 'Object' && options.username ? options.username : options },
}).exec(function (err, user) {
if (err) return cb(err);
if (user) return cb(new Error("A user with that username already exists."));
cb(null, !!user);
});
},
Controller:
User.exists(req.body.user.username, function (err, exists) {
if (err) {
console.log("error: ", err);
return res.status(409).json({
message: err
});
}
User.create(req.user).then(function (data) {
res.status(201).json({
user: data
});
});
});
È questo il migliore pratica? Non sono sicuro che le convenzioni sul nodo favoriscano gli errori per casi eccezionali o per il controllo del flusso. Penso che dovrei riscriverlo, ma voglio conoscere le convenzioni prima di farlo. Penso di aver visto alcuni esempi scritti in questo modo su Sails. Grazie!
Un modo molto più semplice è quello di bandiera 'username' come unico nello schema del modello e utilizzare semplicemente il errore Mongoose ritorna nel tuo controller 'User.create()' per rispondere con un 409. Questo è un approccio più ottimistico perché se l'utente non esiste e se è una richiesta valida, non stai colpendo il DB due volte senza motivo . – srquinn
@jibsales che non ha senso - ma poi, che cosa succede se c'è un errore diverso che richiederebbe una risposta 500?In linguaggi come C#, esistono diversi tipi di eccezioni e puoi controllare quel tipo. So che potrei fare qualcosa del genere su Node se lo volessi, ma è una pratica comune? La decisione che prendo ora influirà sul modo in cui costruisco il resto dell'applicazione. In base al tuo commento, sembra che il nodo utilizzi errori per il controllo del flusso anziché situazioni eccezionali. –
Vedere la mia risposta sotto – srquinn