<!-- review: finished -->

<a id="http-js"></a>

# JS

Позволяет задавать обработчики на njs — подмножестве языка JavaScript.

В наших репозиториях модуль собран [динамически](https://angie.software//angie/docs/installation/index.md#install-dynamicmodules) и
доступен отдельным пакетом `angie-module-njs` или `angie-pro-module-njs`;
подключить его можно с помощью директивы [load_module](https://angie.software//angie/docs/configuration/modules/core.md#load-module).

#### NOTE
Также доступна упрощенная версия пакета под названием `...-njs-light`,
однако она несовместима с обычной версией и не может
использоваться одновременно с ней.

<a id="configuration-example-90"></a>

## Пример конфигурации

```nginx
http {
    js_import http.js;

    js_set $foo     http.foo;
    js_set $summary http.summary;
    js_set $hash    http.hash;

    resolver 10.0.0.1;

    server {
        listen 8000;

        location / {
            add_header X-Foo $foo;
            js_content http.baz;
        }

        location = /summary {
            return 200 $summary;
        }

        location = /hello {
            js_content http.hello;
        }

        location = /fetch {
            js_content                   http.fetch;
            js_fetch_trusted_certificate /path/to/ISRG_Root_X1.pem;
        }

        location = /crypto {
            add_header Hash $hash;
            return     200;
        }
    }
}
```

Файл `http.js`:

```javascript
function foo(r) {
    r.log("hello from foo() handler");
    return "foo";
}

function summary(r) {
    var a, s, h;

    s = "JS summary\n\n";

    s += "Method: " + r.method + "\n";
    s += "HTTP version: " + r.httpVersion + "\n";
    s += "Host: " + r.headersIn.host + "\n";
    s += "Remote Address: " + r.remoteAddress + "\n";
    s += "URI: " + r.uri + "\n";

    s += "Headers:\n";
    for (h in r.headersIn) {
        s += "  header '" + h + "' is '" + r.headersIn[h] + "'\n";
    }

    s += "Args:\n";
    for (a in r.args) {
        s += "  arg '" + a + "' is '" + r.args[a] + "'\n";
    }

    return s;
}

function baz(r) {
    r.status = 200;
    r.headersOut.foo = 1234;
    r.headersOut['Content-Type'] = "text/plain; charset=utf-8";
    r.headersOut['Content-Length'] = 15;
    r.sendHeader();
    r.send("nginx");
    r.send("java");
    r.send("script");

    r.finish();
}

function hello(r) {
    r.return(200, "Hello world!");
}

async function fetch(r) {
    let results = await Promise.all([ngx.fetch('https://example.com/'),
                                     ngx.fetch('https://example.org/')]);

    r.return(200, JSON.stringify(results, undefined, 4));
}

async function hash(r) {
    let hash = await crypto.subtle.digest('SHA-512', r.headersIn.host);
    r.setReturnValue(Buffer.from(hash).toString('hex'));
}

export default {foo, summary, baz, hello, fetch, hash};
```

<a id="directives-87"></a>

## Директивы

<a id="index-0"></a>

<a id="js-body-filter"></a>

### js_body_filter

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_body_filter` функция | модуль.функция [`buffer_type=`строка | буфер];   |
|------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------|
| По умолчанию                                                                             | —                                                                           |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | location, if in location, limit_except                                      |

Задает функцию njs в качестве фильтра тела ответа. Функция фильтра вызывается для каждого блока данных тела ответа со следующими аргументами:

| `r`     | объект [HTTP request](https://angie.software//angie/docs/configuration/njs-reference.md#njs-http-request)                 |
|---------|---------------------------------------------------------------------------------------------------------------------------|
| `data`  | входящий блок данных может быть строкой или буфером в зависимости от значения buffer_type, по умолчанию является строкой. |
| `flags` | объект со следующими свойствами:<br/>- `last` — логическое значение; `true`, если данные являются последним буфером.      |

Функция фильтра может передавать свою модифицированную версию входящего блока данных следующему фильтру тела ответа при помощи вызова [r.sendBuffer()](https://angie.software//angie/docs/configuration/njs-reference.md#r-sendbuffer). Пример преобразования букв в нижний регистр в теле ответа:

```javascript
function filter(r, data, flags) {
    r.sendBuffer(data.toLowerCase(), flags);
}
```

Для отмены фильтра (блоки данных будут передаваться клиенту без вызова js_body_filter), можно использовать [r.done()](https://angie.software//angie/docs/configuration/njs-reference.md#r-done).

Если функция фильтра изменяет длину тела ответа, то необходимо очистить заголовок ответа `Content-Length`  (если присутствует) в [js_header_filter](#js-header-filter), чтобы применить поблочное кодирование.

#### NOTE
Так как обработчик js_body_filter должен сразу возвращать результат, то поддерживаются только синхронные операции, Таким образом, асинхронные операции, например [r.subrequest()](https://angie.software//angie/docs/configuration/njs-reference.md#r-subrequest) или [setTimeout()](https://angie.software//angie/docs/configuration/njs-reference.md#njs-timers), не поддерживаются.

<a id="index-1"></a>

<a id="js-content"></a>

### js_content

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_content` функция | модуль.функция;   |
|------------------------------------------------------------------------------------------|------------------------------------------|
| По умолчанию                                                                             | —                                        |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | location, if in location, limit_except   |

Задает функцию njs в качестве обработчика содержимого location. Можно ссылаться на функцию модуля.

<a id="index-2"></a>

<a id="js-context-reuse"></a>

### js_context_reuse

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_context_reuse` число;   |
|------------------------------------------------------------------------------------------|-----------------------------|
| По умолчанию                                                                             | `js_context_reuse 128;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location      |

Устанавливает максимальное количество контекстов JS для повторного использования движком QuickJS. Каждый контекст используется для одного запроса. Завершенный контекст помещается в пул повторно используемых контекстов. Если пул заполнен, контекст уничтожается.

<a id="index-3"></a>

<a id="js-engine"></a>

### js_engine

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_engine` `njs` | `qjs`;   |
|------------------------------------------------------------------------------------------|------------------------------|
| По умолчанию                                                                             | `js_engine njs;`             |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location       |

Устанавливает движок JavaScript для использования в скриптах njs. Параметр `njs` задает движок njs, также используемый по умолчанию. Параметр `qjs` задает движок QuickJS.

<a id="index-4"></a>

<a id="js-fetch-buffer-size"></a>

### js_fetch_buffer_size

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_buffer_size` размер;   |
|------------------------------------------------------------------------------------------|----------------------------------|
| По умолчанию                                                                             | `js_fetch_buffer_size 16k;`      |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location           |

Задает размер буфера, который будет использоваться для чтения и записи для [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch).

<a id="index-5"></a>

<a id="js-fetch-ciphers"></a>

### js_fetch_ciphers

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_ciphers` шифры;            |
|------------------------------------------------------------------------------------------|--------------------------------------|
| По умолчанию                                                                             | `js_fetch_ciphers HIGH:!aNULL:!MD5;` |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location               |

Описывает разрешенные шифры для HTTPS-соединений при помощи [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch). Шифры задаются в формате, поддерживаемом библиотекой OpenSSL.

Список шифров зависит от установленной версии OpenSSL.
Полный список можно посмотреть с помощью команды `openssl ciphers`.

<a id="index-6"></a>

<a id="js-fetch-max-response-buffer-size"></a>

### js_fetch_max_response_buffer_size

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_max_response_buffer_size` размер;   |
|------------------------------------------------------------------------------------------|-----------------------------------------------|
| По умолчанию                                                                             | `js_fetch_max_response_buffer_size 1m;`       |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                        |

Задает максимальный размер ответа, полученного при помощи [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch).

<a id="index-7"></a>

<a id="js-fetch-protocols"></a>

### js_fetch_protocols

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_protocols` [`TLSv1`] [`TLSv1.1`] [`TLSv1.2`] [`TLSv1.3`];   |
|------------------------------------------------------------------------------------------|-----------------------------------------------------------------------|
| По умолчанию                                                                             | `js_fetch_protocols TLSv1 TLSv1.1 TLSv1.2;`                           |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                                                |

Разрешает указанные протоколы для HTTPS-соединений при помощи [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch).

<a id="index-8"></a>

<a id="js-fetch-timeout"></a>

### js_fetch_timeout

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_timeout` время;   |
|------------------------------------------------------------------------------------------|-----------------------------|
| По умолчанию                                                                             | `js_fetch_timeout 60s;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location      |

Задает таймаут при чтении и записи при помощи [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch). Таймаут устанавливается не на всю передачу ответа, а только между двумя операциями чтения. Если по истечении этого времени данные не передавались, соединение закрывается.

<a id="index-9"></a>

<a id="js-fetch-trusted-certificate"></a>

### js_fetch_trusted_certificate

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_trusted_certificate` файл;   |
|------------------------------------------------------------------------------------------|----------------------------------------|
| По умолчанию                                                                             | —                                      |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                 |

Задает файл с доверенными сертификатами CA в формате PEM, используемыми при проверке HTTPS-сертификата при помощи [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch).

<a id="index-10"></a>

<a id="js-fetch-verify"></a>

### js_fetch_verify

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_verify` `on` | `off`;   |
|------------------------------------------------------------------------------------------|-----------------------------------|
| По умолчанию                                                                             | `js_fetch_verify on;`             |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location            |

Разрешает или запрещает проверку сертификата HTTPS-сервера при помощи [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch).

<a id="index-11"></a>

<a id="js-fetch-verify-depth"></a>

### js_fetch_verify_depth

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_verify_depth` число;   |
|------------------------------------------------------------------------------------------|----------------------------------|
| По умолчанию                                                                             | `js_fetch_verify_depth 100;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location           |

Устанавливает глубину проверки в цепочке HTTPS-сертификатов при помощи [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch).

<a id="index-12"></a>

<a id="js-fetch-keepalive"></a>

### js_fetch_keepalive

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_keepalive` соединения;   |
|------------------------------------------------------------------------------------------|------------------------------------|
| По умолчанию                                                                             | `js_fetch_keepalive 0;`            |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location             |

Активирует кэш соединений к серверам назначения. Когда значение больше `0`, включает keepalive-соединения для [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch).

Параметр соединения задает максимальное количество неактивных keepalive-соединений к серверам назначения, которые сохраняются в кэше каждого рабочего процесса. Когда это число превышено, закрываются наименее недавно использованные соединения.

Пример:

```nginx
location /fetch {
    js_fetch_keepalive 32;
    js_fetch_trusted_certificate /path/to/ISRG_Root_X1.pem;
    js_content main.fetch_handler;
}
```

<a id="index-13"></a>

<a id="js-fetch-keepalive-requests"></a>

### js_fetch_keepalive_requests

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_keepalive_requests` число;   |
|------------------------------------------------------------------------------------------|----------------------------------------|
| По умолчанию                                                                             | `js_fetch_keepalive_requests 1000;`    |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                 |

Задает максимальное количество запросов, которые могут обрабатываться через одно keepalive-соединение с [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch). После выполнения максимального количества запросов соединение закрывается.

Периодическое закрытие соединений необходимо для освобождения выделенной памяти для каждого соединения. Поэтому использование слишком большого максимального количества запросов может привести к чрезмерному использованию памяти и не рекомендуется.

<a id="index-14"></a>

<a id="js-fetch-keepalive-time"></a>

### js_fetch_keepalive_time

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_keepalive_time` время;   |
|------------------------------------------------------------------------------------------|------------------------------------|
| По умолчанию                                                                             | `js_fetch_keepalive_time 1h;`      |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location             |

Ограничивает максимальное время, в течение которого запросы могут обрабатываться через одно keepalive-соединение с [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch). По достижении этого времени соединение закрывается после обработки следующего запроса.

<a id="index-15"></a>

<a id="js-fetch-keepalive-timeout"></a>

### js_fetch_keepalive_timeout

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_fetch_keepalive_timeout` время;   |
|------------------------------------------------------------------------------------------|---------------------------------------|
| По умолчанию                                                                             | `js_fetch_keepalive_timeout 60s;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                |

Задает таймаут, в течение которого неактивное keepalive-соединение к серверу назначения остается открытым при помощи [Fetch API](https://angie.software//angie/docs/configuration/njs-reference.md#ngx-fetch).

<a id="index-16"></a>

<a id="js-header-filter"></a>

### js_header_filter

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_header_filter` функция | модуль.функция;   |
|------------------------------------------------------------------------------------------|------------------------------------------------|
| По умолчанию                                                                             | —                                              |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | location, if in location, limit_except         |

Задает функцию njs в качестве фильтра заголовка ответа. Директива позволяет менять произвольные поля заголовка ответа.

#### NOTE
Так как обработчик js_header_filter должен сразу возвращать результат, то поддерживаются только синхронные операции. Таким образом, асинхронные операции, например [r.subrequest()](https://angie.software//angie/docs/configuration/njs-reference.md#r-subrequest) или [setTimeout()](https://angie.software//angie/docs/configuration/njs-reference.md#njs-timers), не поддерживаются.

<a id="index-17"></a>

<a id="js-import"></a>

### js_import

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_import` модуль.js | имя_экспорта from модуль.js;   |
|------------------------------------------------------------------------------------------|--------------------------------------------------------|
| По умолчанию                                                                             | —                                                      |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                                 |

Импортирует модуль, позволяющий задавать обработчики location и переменных на njs. Имя_экспорта является пространством имен при доступе к функциям модуля. Если имя_экспорта не задано, то пространством имен будет являться имя модуля.

```nginx
js_import http.js;
```

В примере при доступе к экспорту в качестве пространства имен используется имя модуля http. Если импортируемый модуль экспортирует foo(), то для доступа используется http.foo.

Директив js_import может быть несколько.

<a id="index-18"></a>

<a id="js-path"></a>

### js_path

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_path` путь;        |
|------------------------------------------------------------------------------------------|------------------------|
| По умолчанию                                                                             | —                      |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location |

Задает дополнительный путь для модулей njs.

<a id="index-19"></a>

<a id="js-periodic"></a>

### js_periodic

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_periodic` модуль.функция [`interval=`\\ время] [`jitter=`\\ число] [`worker_affinity=`\\ маска];   |
|------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|
| По умолчанию                                                                             | —                                                                                                      |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | location                                                                                               |

Задает обработчик содержимого для запуска через регулярные интервалы. Обработчик получает объект сеанса в качестве первого аргумента, он также имеет доступ к глобальным объектам, таким как `ngx`.

Необязательный параметр `interval` задает интервал между двумя последовательными запусками, по умолчанию — 5 секунд.

Необязательный параметр `jitter` задает время, в течение которого обработчик содержимого location будет случайно задержан, по умолчанию задержки нет.

По умолчанию `js_handler` выполняется в рабочем процессе 0. Необязательный параметр `worker_affinity` позволяет указать определенные рабочие процессы, в которых должен выполняться обработчик содержимого location. Каждый набор рабочих процессов представлен битовой маской разрешенных рабочих процессов. Маска `all` позволяет выполнять обработчик во всех рабочих процессах.

Пример:

```nginx
example.conf:

location @periodics {
    # запуск с интервалом в 1 минуту в рабочем процессе 0
    js_periodic main.handler interval=60s;

    # запуск с интервалом в 1 минуту во всех рабочих процессах
    js_periodic main.handler interval=60s worker_affinity=all;

    # запуск с интервалом в 1 минуту в рабочих процессах 1 и 3
    js_periodic main.handler interval=60s worker_affinity=0101;

    resolver 10.0.0.1;
    js_fetch_trusted_certificate /path/to/ISRG_Root_X1.pem;
}
```

```javascript
example.js:

async function handler(s) {
    let reply = await ngx.fetch('https://example.com/');
    let body = await reply.text();

    ngx.log(ngx.INFO, body);
}
```

<a id="index-20"></a>

<a id="js-preload-object"></a>

### js_preload_object

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_preload_object` имя.json | имя from файл.json;   |
|------------------------------------------------------------------------------------------|------------------------------------------------------|
| По умолчанию                                                                             | —                                                    |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                               |

Предварительно загружает неизменяемый объект во время конфигурации. Имя используется в качестве имени глобальной переменной, через которую объект доступен в коде njs. Если имя не указано, то будет использоваться имя файла.

```nginx
js_preload_object map.json;
```

В примере map используется в качестве имени во время доступа к предварительно загруженному объекту.

Директив js_preload_object может быть несколько.

<a id="index-21"></a>

<a id="js-set"></a>

### js_set

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_set` $переменная функция | модуль.функция [`nocache`];   |
|------------------------------------------------------------------------------------------|--------------------------------------------------------------|
| По умолчанию                                                                             | —                                                            |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                                       |

Задает функцию njs для указанной переменной. Можно ссылаться на функцию модуля.

Функция вызывается в момент первого обращения к переменной для данного запроса. Точный момент вызова функции зависит от [фазы](https://angie.software//angie/docs/configuration/processing.md#stream-sessions), в которой происходит обращение к переменной. Это можно использовать для реализации дополнительной логики, не относящейся к вычислению переменной. Например, если переменная указана в директиве [log_format](https://angie.software//angie/docs/configuration/modules/http/http_log.md#log-format), то ее обработчик не будет выполняться до фазы записи в лог. Этот обработчик также может использоваться для выполнения процедур непосредственно перед освобождением запроса.

Начиная с njs 0.8.6, если указан необязательный аргумент `nocache`, обработчик вызывается каждый раз при обращении к нему. Из-за текущих ограничений модуля rewrite, когда переменная `nocache` используется директивой set, ее обработчик должен всегда возвращать значение фиксированной длины.

#### NOTE
Так как обработчик js_set должен сразу возвращать результат, то поддерживаются только синхронные операции. Таким образом, асинхронные операции, например [r.subrequest()](https://angie.software//angie/docs/configuration/njs-reference.md#r-subrequest) или [setTimeout()](https://angie.software//angie/docs/configuration/njs-reference.md#njs-timers), не поддерживаются.

<a id="index-22"></a>

<a id="js-shared-dict-zone"></a>

### js_shared_dict_zone

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_shared_dict_zone` `zone=`имя:размер [`timeout=`время] [`type=``string` | `number`] [`evict`] [`state=`файл];   |
|------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------|
| По умолчанию                                                                             | —                                                                                                                  |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http                                                                                                               |

Задает имя и размер зоны разделяемой памяти, в которой хранится словарь ключей и значений, разделяемый между рабочими процессами.

| `type`    | необязательный параметр, позволяет изменить тип значения на числовой (`number`);<br/>по умолчанию в качестве ключа и значения используется строка (`string`).   |
|-----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `timeout` | необязательный параметр, задает время, по завершении которого все записи в словаре удаляются из зоны                                                            |
| `evict`   | необязательный параметр, удаляет самую старую пару "ключ-значение" при переполнении зоны                                                                        |
| `state`   | необязательный параметр, указывает файл, который хранит состояние разделяемого словаря в формате JSON и делает его постоянным при перезапусках nginx            |

Пример:

```nginx
example.conf:
    # Создается словарь размером 1Мб со строковыми значениями,
    # пары "ключ-значение" удаляются при отсутствии активности в течение 60 секунд:
    js_shared_dict_zone zone=foo:1M timeout=60s;

    # Создается словарь размером 512Кб со строковыми значениями,
    # удаляется самая старая пара "ключ-значение" при переполнении зоны:
    js_shared_dict_zone zone=bar:512K timeout=30s evict;

    # Создается постоянный словарь размером 32Кб с числовыми значениями:
    js_shared_dict_zone zone=num:32k type=number;

    # Создается словарь размером 1Мб со строковыми значениями и постоянным состоянием:
    js_shared_dict_zone zone=persistent:1M state=/tmp/dict.json;
```

```javascript
example.js:
    function get(r) {
        r.return(200, ngx.shared.foo.get(r.args.key));
    }

    function set(r) {
        r.return(200, ngx.shared.foo.set(r.args.key, r.args.value));
    }

    function delete(r) {
        r.return(200, ngx.shared.bar.delete(r.args.key));
    }

    function increment(r) {
        r.return(200, ngx.shared.num.incr(r.args.key, 2));
    }
```

<a id="index-23"></a>

<a id="js-var"></a>

### js_var

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `js_var` $переменная [значение];   |
|------------------------------------------------------------------------------------------|------------------------------------|
| По умолчанию                                                                             | —                                  |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location             |

Объявляет [перезаписываемую](https://angie.software//angie/docs/configuration/njs-reference.md#r-variables) переменную. В качестве значения можно использовать текст, переменные и их комбинации. Переменная не перезаписывается после перенаправления, в отличие от переменных, созданных при помощи директивы set.

<a id="request-argument"></a>

## Аргумент запроса

Каждый HTTP-обработчик njs получает один аргумент, объект [запроса](https://angie.software//angie/docs/configuration/njs-reference.md#njs-http-request).
