# Bygg en bearbetningspipeline med transforms

> Registrera flera steg under ett namn med NEWTRANSFORM() och låt ett värde gå igenom dem i ordning med TRANSFORM().

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: sv
Content-SHA256: 18d4c58334f94661fb42bd3971b8482806124643976c759a2561efdacfd9a0f8
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

En transform är en namngiven kedja av steg. `NEWTRANSFORM(name, fn, [id])` lägger till ett steg i kedjan `name`; stegen körs i den ordning de registrerades, och var och ett får alternativobjektet `$` och det aktuella värdet. Ändra värdet med `$.value = ...` och anropa `$.next()` för att gå vidare till nästa steg. `$.invalid(message)` lägger till ett fel. `TRANSFORM(name, value)` startar kedjan och returnerar ett löfte (promise) med slutvärdet; löftet avvisas när ett steg har rapporterat ett fel. Med en callback i stället `TRANSFORM(name, value, function(err, value) {})`. Ett namn utan några steg returnerar värdet oförändrat.

Använd det för arbete som måste kunna byggas ut från flera ställen, som att rensa en kommentar innan den sparas: ett spamfilter, en blankstegsrensare och en länkkontroll kan var och en leva i sin egen fil och läggas till eller tas bort utan att röra koden som anropar `TRANSFORM()`. Det valfria `id` låter dig ta bort ett steg senare med `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();
}
```
