# Eine Verarbeitungspipeline mit Transforms bauen

> Registriere mehrere Schritte unter einem Namen mit NEWTRANSFORM() und lasse einen Wert mit TRANSFORM() der Reihe nach durch sie laufen.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: de
Content-SHA256: 85f3f3b2f553deedfab14313021c77026c7abec891e4bde056a5cfe0c463d836
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Ein Transform ist eine benannte Kette von Schritten. `NEWTRANSFORM(name, fn, [id])` fügt der Kette `name` einen Schritt hinzu; die Schritte laufen in der Reihenfolge ihrer Registrierung, und jeder erhält das Optionsobjekt `$` und den aktuellen Wert. Ändere den Wert mit `$.value = ...` und rufe `$.next()` auf, um mit dem nächsten Schritt fortzufahren. `$.invalid(message)` fügt einen Fehler hinzu. `TRANSFORM(name, value)` startet die Kette und gibt ein Promise mit dem Endwert zurück; das Promise wird abgelehnt, wenn ein Schritt einen Fehler gemeldet hat. Mit einem Callback stattdessen `TRANSFORM(name, value, function(err, value) {})`. Ein Name ohne Schritte gibt den Wert unverändert zurück.

Nutze es für Arbeit, die von mehreren Stellen aus erweiterbar sein muss, etwa das Bereinigen eines Kommentars vor dem Speichern: Ein Spamfilter, ein Trimmer und ein Link-Prüfer können jeweils in einer eigenen Datei leben und hinzugefügt oder entfernt werden, ohne den Code anzufassen, der `TRANSFORM()` aufruft. Mit der optionalen `id` kannst du einen Schritt später mit `NEWTRANSFORM(name, null, id)` entfernen.

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