Zbuduj potok przetwarzania z użyciem transformów
Transform to nazwany łańcuch kroków. NEWTRANSFORM(name, fn, [id]) dodaje krok do łańcucha name; kroki wykonują się w kolejności rejestracji, a każdy dostaje obiekt opcji $ i bieżącą wartość. Zmień wartość przez $.value = ... i wywołaj $.next(), aby przejść do następnego kroku. $.invalid(message) dodaje błąd. TRANSFORM(name, value) uruchamia łańcuch i zwraca obietnicę z wartością końcową; obietnica jest odrzucana, gdy któryś krok zgłosił błąd. Z callbackiem zamiast tego TRANSFORM(name, value, function(err, value) {}). Nazwa bez żadnego kroku zwraca wartość bez zmian.
Używaj tego do pracy, którą trzeba móc rozszerzać z wielu miejsc, jak czyszczenie komentarza przed zapisem: filtr spamu, przycinacz spacji i sprawdzacz linków mogą mieszkać każdy we własnym pliku i być dodawane lub usuwane bez dotykania kodu wywołującego TRANSFORM(). Opcjonalne id pozwala później usunąć krok przez NEWTRANSFORM(name, null, id).
NEWTRANSFORM('comment', function($, value) {
$.value = value.trim();
$.next();
}, 'trim');
NEWTRANSFORM('comment', function($, value) {
if (/spam/i.test(value))
$.invalid('Spam is not allowed');
$.next();
}, 'spam');
NEWTRANSFORM('comment', function($, value) {
$.value = value.replace(/\s+/g, ' ');
$.next();
}, 'spaces');exports.install = function() {
ROUTE('POST /comment/ @json', comment);
ROUTE('DELETE /comment/spaces/', remove_step);
};
async function comment($) {
try {
var text = await TRANSFORM('comment', $.body.text);
$.json({ text: text });
} catch (err) {
$.json({ error: true });
}
}
function remove_step($) {
NEWTRANSFORM('comment', null, 'spaces');
$.success();
}