# Een verwerkingspijplijn bouwen met transforms

> Registreer meerdere stappen onder één naam met NEWTRANSFORM() en laat een waarde er in volgorde doorheen lopen met TRANSFORM().

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: nl
Content-SHA256: 3fdcbe66660700e2f7c84101d9d2a0be23b0c56e301bb6556fdc45cfb72fc152
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

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)`.

```js 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');
```

```js 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();
}
```
