# Опции за NEWACTION и обектът на действие получава

> Конфигурирайте NEWACTION и използвайте контекста за действие, за да се справите с исканията.

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

`NEWACTION(name, options)` декларира действие. `name` е неговият идентификатор (`Users/insert`): маршрутите го използват с `--> *Users/insert`, а вашият код с `ACTION('Users/insert', payload)`.

## Опции

| Опция | Стойност | Какво прави |
|---|---|---|
| `name` | текст | Описание на действието; налично е и като `$.name`. |
| `action` | `function($, model)` | Кодът на действието. `model` е валидираният вход. |
| `input` | текст | Полетата на тялото, като `name:Type`, разделени със запетаи; `*` пред името го прави задължително. Вижте страницата за входните типове. |
| `output` | текст | Полетата на отговора; полетата, които не са изброени, се премахват. |
| `params` | текст | Сегментите `{name}` на маршрута, валидирани като `input`. |
| `query` | текст | Низът на заявката, валидиран като `input`. |
| `partial` | `true` | До действието стигат само изпратените полета. Използвайте го за `PATCH`. |
| `user` | `true` или `false` | `true` отговаря 401, когато няма влязъл потребител; `false` приема само анонимни заявки. |
| `permissions` | текст или масив | `'read,write'`: потребителят се нуждае от едно от тях (или да е супер администратор). |
| `route` | текст | Декларира тук маршрута на действието: `'GET /products/'`, или `true` за маршрут `API`. |
| `middleware` | текст | Имена на middleware, които се изпълняват преди действието, разделени с интервали или запетаи. |
| `timeout` | милисекунди | Когато действието не отговори навреме, заявката пропада с грешката `Timeout.`. |
| `cache` | `true` или обект | Запазвайте резултата от действие с `CACHE`. |
| `config` | обект | Стойности, които действието чете от `$.config`. |
| `audit` | text | Записва събитие след успешно завършване; отделната рецепта проверява границите. [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/) |

## Обектът `$` на действие

| Член | Какво е |
|---|---|
| `$.query`, `$.params` | Валидираният низ на заявката и сегментите на маршрута. |
| `$.payload` | Валидираният вход; това е същият обект като втория аргумент на `action`. |
| `$.user` | Влезлият потребител. |
| `$.config` | Опцията `config`. |
| `$.name`, `$.id` | Опцията `name` и идентификаторът на действието. |
| `$.controller` | `$` на маршрута, когато действието е извикано от маршрут, така че `$.controller.body` е суровото тяло. Не съществува, когато действието се вика с `ACTION()`. |
| `$.callback(value)` | Отговаря със стойност; филтрира се от `output`. Без аргументи връща функция `(err, response)`. |
| `$.success(value)` | Отговаря `{ success: true }`. |
| `$.invalid(error)` | Отговаря с грешка: текст, код на състоянието или `ErrorBuilder`. |
| `$.done(arg)`, `$.successful(fn)` | Връщат callback функции за функции, които съобщават грешка като първи аргумент. |
| `$.cookie(name, value, expiration)` | Чете или записва бисквитка на заявката. |
| `$.redirect(url)` | Пренасочва заявката. |
| `$.output(name)` | Избира как отговаря маршрутът: `json`, `html`, `xml`, `text`, `redirect`, `binary`, `jsonstring`, `empty` или `file`. |
| `$.unauthorized(...permissions)` | Отговаря 401 и връща `true`, когато потребителят няма нито едно от разрешенията. |
| `$.action(name, payload)` | Изпълнява друго действие със същата заявка. |
| `$.hostname(path)` | Адресът на този сървър. |

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