ForgeTotal.js 5
nl

Total.js 5

Een verwerkingspijplijn bouwen met transforms

Total.js 5 · total5@0.0.19 transformpipeline Uitgevoerd met Total.js 5

Een transform is een benoemde keten van stappen. NEWTRANSFORM(name, fn, [id]) voegt een stap toe aan de keten name; stappen draaien in de volgorde van registratie en elk krijgt het opties-object $ en de huidige waarde. Wijzig de waarde met $.value = ... en roep $.next() aan om met de volgende stap verder te gaan. $.invalid(message) voegt een fout toe. TRANSFORM(name, value) start de keten en geeft een promise met de eindwaarde terug; de promise wordt afgewezen wanneer een stap een fout heeft gemeld. Met een callback in plaats daarvan TRANSFORM(name, value, function(err, value) {}). Een naam zonder stappen geeft de waarde ongewijzigd terug.

Gebruik het voor werk dat vanuit meerdere plekken uitbreidbaar moet zijn, zoals het opschonen van een reactie voordat die wordt opgeslagen: een spamfilter, een spatietrimmer en een linkcontrole kunnen elk in hun eigen bestand wonen en worden toegevoegd of verwijderd zonder de code aan te raken die TRANSFORM() aanroept. Met de optionele id kun je een stap later verwijderen met NEWTRANSFORM(name, null, id).

definitions/transforms.js
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');
controllers/comments.js
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();
}