# Opties van NEWACTION en het object een actie ontvangt

> Configureer NEWACTION en gebruik de actiecontext om verzoeken te behandelen.

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

`NEWACTION(name, options)` declareert een actie. `name` is de id (`Users/insert`): routes gebruiken die met `--> *Users/insert` en je code met `ACTION('Users/insert', payload)`.

## Opties

| Optie | Waarde | Wat het doet |
|---|---|---|
| `name` | tekst | Een beschrijving van de actie; ook beschikbaar als `$.name`. |
| `action` | `function($, model)` | De code van de actie. `model` is de gevalideerde invoer. |
| `input` | tekst | De velden van de body, als `name:Type` gescheiden door komma's; een `*` voor de naam maakt het verplicht. Zie de pagina over invoertypen. |
| `output` | tekst | De velden van het antwoord; velden die niet zijn opgesomd worden verwijderd. |
| `params` | tekst | De `{name}`-segmenten van de route, gevalideerd zoals `input`. |
| `query` | tekst | De querystring, gevalideerd zoals `input`. |
| `partial` | `true` | Alleen de velden die zijn verzonden bereiken de actie. Gebruik het voor `PATCH`. |
| `user` | `true` of `false` | `true` antwoordt 401 als er geen ingelogde gebruiker is; `false` accepteert alleen anonieme verzoeken. |
| `permissions` | tekst of array | `'read,write'`: de gebruiker heeft er een van nodig (of moet superbeheerder zijn). |
| `route` | tekst | Declareert hier de route van de actie: `'GET /products/'`, of `true` voor een `API`-route. |
| `middleware` | tekst | Namen van middleware die vóór de actie draaien, gescheiden door spaties of komma's. |
| `timeout` | milliseconden | Als de actie niet op tijd antwoordt, mislukt het verzoek met de fout `Timeout.`. |
| `cache` | `true` of een object | Bewaar het resultaat van een actie met `CACHE`. |
| `config` | object | Waarden die de actie leest uit `$.config`. |
| `audit` | text | Registreert een gebeurtenis na succesvolle voltooiing; het aparte recept controleert de grenzen. [action-audit](/en/total5/action-audit/) |
| `csrf`, `encrypt`, `compress`, `publish` | - | [action-transport-boundaries](/en/total5/action-transport-boundaries/) |
| `sa`, `su` | true | [action-hooks-and-admin](/en/total5/action-hooks-and-admin/) |
| `oninput`, `onoutput` | function | [action-hooks-and-admin](/en/total5/action-hooks-and-admin/) |
| `extend` | path | [action-hooks-and-admin](/en/total5/action-hooks-and-admin/) |

## Het object `$` van een actie

| Lid | Wat het is |
|---|---|
| `$.query`, `$.params` | De gevalideerde querystring en routesegmenten. |
| `$.payload` | De gevalideerde invoer; het is hetzelfde object als het tweede argument van `action`. |
| `$.user` | De ingelogde gebruiker. |
| `$.config` | De optie `config`. |
| `$.name`, `$.id` | De optie `name` en de id van de actie. |
| `$.controller` | De `$` van de route wanneer de actie vanuit een route is aangeroepen, dus `$.controller.body` is de ruwe body. Bestaat niet wanneer de actie met `ACTION()` wordt aangeroepen. |
| `$.callback(value)` | Antwoordt met een waarde; die wordt gefilterd door `output`. Zonder argumenten geeft het een functie `(err, response)` terug. |
| `$.success(value)` | Antwoordt `{ success: true }`. |
| `$.invalid(error)` | Antwoordt met een fout: een tekst, een statuscode of een `ErrorBuilder`. |
| `$.done(arg)`, `$.successful(fn)` | Geven callbacks terug voor functies die een fout als eerste argument melden. |
| `$.cookie(name, value, expiration)` | Leest of schrijft een cookie van het verzoek. |
| `$.redirect(url)` | Verwijst het verzoek door. |
| `$.output(name)` | Kiest hoe een route antwoordt: `json`, `html`, `xml`, `text`, `redirect`, `binary`, `jsonstring`, `empty` of `file`. |
| `$.unauthorized(...permissions)` | Antwoordt 401 en geeft `true` terug wanneer de gebruiker geen van de rechten heeft. |
| `$.action(name, payload)` | Voert een andere actie uit met hetzelfde verzoek. |
| `$.hostname(path)` | Het adres van deze server. |

```js definitions/options.js
MIDDLEWARE('tag', function($, next) {
	$.response.headers['x-tag'] = 'on';
	next();
});

var counter = { cached: 0 };
MAIN.counter = counter;

NEWACTION('Options/named', {
	name: 'The name',
	config: { limit: 3 },
	action: function($) {
		$.callback({ name: $.name, id: $.id, limit: $.config.limit });
	}
});

NEWACTION('Options/guarded', {
	name: 'Needs a user',
	user: true,
	permissions: 'read',
	action: function($) {
		$.success();
	}
});

NEWACTION('Options/slow', {
	name: 'Never answers',
	timeout: 300,
	action: function($) {}
});

NEWACTION('Options/cached', {
	name: 'The cache option',
	query: 'page:Number',
	cache: { expire: '1 minute', query: 'page' },
	action: function($) {
		counter.cached++;
		$.callback({ page: $.query.page, runs: counter.cached });
	}
});

NEWACTION('Options/routed', {
	name: 'Declares its own route',
	route: 'GET /routed/ #tag',
	action: function($) {
		$.callback({ routed: true });
	}
});

NEWACTION('Options/output', {
	name: 'Chooses how to answer',
	action: function($) {
		$.output('plain');
		$.callback('plain text');
	}
});

AUTH(function($) {
	if ($.headers['x-user'])
		$.success({ id: '1', permissions: $.headers['x-user'].split(',') });
	else
		$.invalid();
});
```

```js controllers/options.js
exports.install = function() {
	ROUTE('GET /named/ --> *Options/named');
	ROUTE('GET /guarded/ --> *Options/guarded');
	ROUTE('GET /slow/ --> *Options/slow');
	ROUTE('GET /cached/ --> *Options/cached');
	ROUTE('GET /output/ --> *Options/output');
};
```
