Input-Validierung, Bereinigung und service-layer
Ich versuche, meine controller-Aktionen so leicht wie möglich, so bin ich der Implementierung von service-Schicht. Jetzt habe ich stucked mit Validierung und-Bereinigung. Ich weiß, dass die Validierung sollte durchgeführt werden in der service-Schicht, aber was ist Desinfektion? Ich möchte zu re-Rendern, die mit den input-Daten, wenn es Fehler bei der Validierung.
//userService.js function
function register(data, callback) {
if (!data) {
return callback(new Error('Here some error...'));
}
/* Sanitize and validate the data */
/* Method #1 */
//If not valid then call back with validationErrors
if (notValid) {
return callback({
validationErrors: {
'username': 'Username is already in use.',
'email': 'Invalid characters.',
}
});
}
/* Method #2 */
if (notValid) {
return callback({
fields: {
//We put here a sanitized fields
},
validationErrors: {
'username': 'Username is already in use.',
'email': 'Invalid characters.',
}
});
}
};
//userController.js function
//GET/POST: /register
function registerAction(request, response, next) {
if (request.method === 'POST') {
var registerData = {
username: request.body['username'],
password: request.body['password'],
email: request.body['email'],
firstName: request.body['firstName'],
lastName: request.body['lastName'],
};
register(registerData, function(error, someDataIfSucceed) {
if (error) {
//Re-post the data so the user wont have to fill the form again
//Sanitize registerData variable here.
return response.render('register', {
error: error,
validationErrors: error.validationErrors
});
};
//User registered succesfully.
return response.render('registerSuccess');
});
return;
}
return response.render('register');
}
Ich sehe gibt es 2 Optionen.
- Rufen Sie die service-Funktion 'registrieren' mit raw POST-Daten, bereinigen und validieren Sie ihn dann nach hinten schieben nur Fehler bei der Validierung. Wenn die Validierung Fehler dann bereinigen Sie im controller vor dem Rendern der Ansicht.
- Gleiche wie die erste, aber wir push-back-Validierung Fehler und gereinigte Felder an.
- Gibt es nicht eine richtige Antwort auf das, was am besten funktioniert für Ihre Bedürfnisse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie Express, eine interessante option ist:
Erstellen einer middleware und verwenden Sie es als eine Validierung Schicht, mit express-validator, die auf node-validator.
Zum Beispiel (siehe node-validator-Dokumentation für alle Validierungs - /- Bereinigung-Optionen):
Dann, in Ihrem controller, einfach erhalten Sie die validierte Anfrage-Parameter, und führen Sie die Zeichen up-Logik (Ihre
register
Funktion Ruf-und-Antwort-Darstellung),IMHO, auf diese Weise halten Sie Ihren code sauber und entkoppelt.
Wenn es ein kleines Projekt nicht stören, nur das tun, was funktioniert.
Wenn, jedoch, es ist eine große (lies: lange Dauer) Projekt:
Wenn Sie von "Bereinigung" du meinst, HTTP/HTML-Bereinigung (Input, oder der display-Meldungen), dann gehört in den controller. Denken Sie an es auf diese Weise: der regler darf nicht der einzige Ort, wo Sie pass Eingang zu Ihrem service-layer aus. In Zukunft haben Sie möglicherweise API Zugriff auf den Dienst. Oder ein test-Treiber kann es aufrufen, direkt, ohne Umweg über HTTP. Also HTTP/HTML ist nur die Beförderung, und als solche Logik bestimmten, sollten außerhalb des Dienstes.
Wenn, jedoch, durch die "Bereinigung" du meinst, business-Logik-Bereinigung (z.B.: Sie erlauben nicht, dass nicht-vorhandenen Ländercodes), dann mit allen Mitteln dies sollte in den service, für genau den gleichen Gründen.