[comment]: # translation:outdated

[comment]: # ({42979355-213e862c})
# 5 JavaScript предобрада

[comment]: # ({/42979355-213e862c})

[comment]: # ({f3c5a895-57d3be9d})
### Преглед

Овај одељак пружа детаље о предобради JavaScript-ом.

[comment]: # ({/f3c5a895-57d3be9d})

[comment]: # ({4201eb7d-076d2285})
### JavaScript предобрада

JavaScript предобрада се врши позивањем JavaScript функције са
једним параметром 'value' и телом функције које даје корисник.
Резултат корака предобрадe је вредност коју враћа ова функција,
на пример, да бисте извршили конверзију Fahrenheit у Celsius, унесите:

    return (value - 32)  * 5 / 9

у параметрима за предобраду у JavaScript-у, који ће бити умотани у
JavaScript функцији по серверу:

```javascript
function (value)
{
   return (value - 32) * 5 / 9
}
```

Улазни параметар 'value' се увек прослеђује као стринг. Повратак
вредност се аутоматски приморава на стринг преко toString() методе (ако
не успе, онда се грешка враћа као стринг вредност), са неколико
изузетака:

-  враћање недефинисане вредности ће резултирати грешком;
-  враћање null вредности ће довести до одбацивања улазне вредности,
    слично као предобрада 'Discard value' у акцији 'Custom on fail'.

Грешке се могу вратити бацањем вредности/објеката (обично или
стрингови или Error објекти).

На пример:

```javascript
if (value == 0)
    throw "Zero input value"
return 1/value
```

Свака скрипта има временско ограничење за извршавање од 10 секунди (у зависности од скрипте,
може потрајати дуже да се временско ограничење окидача активира); прекорачење тога ће
вратити грешку. Примењује се ограничење хипа од 512 мегабајта.

Бајт-код корака предобрадe JavaScript-а се кешује и поново користи када се
корак примењује следећи пут. Све промене корака предобрадe ставке
ће проузроковати да се кеширана скрипта ресетује и поново компајлира касније.

Узастопни кварови током рада (3 у низу) ће узроковати поновну
иницијализацију покретачког механизма да би се ублажила могућност да један скрипт разбије
окружење за извршавање за следеће скрипте (ова акција се евидентира са
DebugLevel 4 и више).

JavaScript предобрада је имплементиранa помоћу [Duktape](https://duktape.org/) JavaScript покретачког механизма.

Такође погледајте: [Додатни JavaScript објекти и глобалне
функције](/manual/config/items/preprocessing/javascript/javascript_objects)

[comment]: # ({/4201eb7d-076d2285})

[comment]: # ({a89f6d69-c932b901})
##### Коришћење макроа у скриптама

Могуће је користити корисничке макрое у JavaScript коду. Ако сценарио
садржи корисничке макрое, те макрое пре решава сервер/прокси
извршавање одређених корака предобраде. Имајте на уму да приликом тестирања
кораке предобраде у kориснички интерфејс, вредности макроа неће бити повучене и
потребно је ручно унети.

::: noteclassic
 Контекст се занемарује када се макро замени његовом вредношћу.
Вредност макроа је уметнута у код какав јесте, није могуће додати
додатно избегавање пре постављања вредности у JavaScript код.
Имајте на уму да то у неким случајевима може изазвати грешке у JavaScript-у.
:::

У примеру испод, ако примљена вредност премашује {$THRESHOLD} макро
вредност, уместо тога ће бити враћена гранична вредност (ако је присутна):

```javascript
var threshold = '{$THRESHOLD}';
return (!isNaN(threshold) && value > threshold) ? threshold : value;
```

[comment]: # ({/a89f6d69-c932b901})

[comment]: # ({023bc14f-6a424b72})
### Примери

Следећи примери илуструју како можете да користите JavaScript предобраду.

Сваки пример садржи кратак опис, тело функције за параметре предобраде JavaScript-а и резултат корака пре обраде – вредност коју враћа функција.

[comment]: # ({/023bc14f-6a424b72})

[comment]: # ({565e57c6-ae8e02fb})
##### Пример 1: Претворите број (научна нотација у цео број)

Претворите број "2.62128e+07" из научне нотације у цео број.

```javascript
return (Number(value))
```

Вредност коју враћа функција: 26212800.

[comment]: # ({/565e57c6-ae8e02fb})

[comment]: # ({5a30e4ee-f6e6bf55})
##### Пример 2: Претворите број (бинарни у децимални)

Претворите бинарни број "11010010" у децимални број.

```javascript
return(parseInt(value,2))
```

Вредност коју враћа функција: 210.

[comment]: # ({/5a30e4ee-f6e6bf55})

[comment]: # ({35ba7ead-6ca17bad})
##### Пример 3: Заокружите број

Заокружите број "18.2345" на 2 цифре.

```javascript
return(Math.round(value* 100) / 100)
```

Вредност коју враћа функција: 18.23.

[comment]: # ({/35ba7ead-6ca17bad})

[comment]: # ({d27ba472-7385d4e0})
##### Пример 4: Преброј слова у низу

Пребројите број слова у низу "Zabbix".

```javascript
return (value.length)
```

Вредност коју враћа функција: 6.

[comment]: # ({/d27ba472-7385d4e0})

[comment]: # ({a521a081-47caadc8})
##### Пример 5: Добијте преостало време

Добијте преостало време (у секундама) до датума истека сертификата (Feb 12 12:33:56 2022 GMT).

```javascript
var split = value.split(' '),
    MONTHS_LIST = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    month_index = ('0' + (MONTHS_LIST.indexOf(split[0]) + 1)).slice(-2),
    ISOdate = split[3] + '-' + month_index + '-' + split[1] + 'T' + split[2],
    now = Date.now();

return parseInt((Date.parse(ISOdate) - now) / 1000);
```

Вредност коју враћа функција: 44380233.

[comment]: # ({/a521a081-47caadc8})

[comment]: # ({f91807bf-fef95b5b})
##### Пример 6: Уклоните JSON својства

Измените JSON структуру података уклањањем свих својстава са кључем `"data_size"` или `"index_size"`.

```javascript
var obj=JSON.parse(value);

for (i = 0; i < Object.keys(obj).length; i++) {
    delete obj[i]["data_size"];
    delete obj[i]["index_size"];
}

return JSON.stringify(obj)
```

Вредност коју прихвата функција:

```json
[
    {
        "table_name":"history",
        "data_size":"326.05",
        "index_size":"174.34"
    },
    {
        "table_name":"history_log",
        "data_size":"6.02",
        "index_size":"3.45"
    }
]
```

Вредност коју враћа функција:

```json
[
    {
        "table_name":"history"
    },
    {
        "table_name":"history_log"
    }
]
```

[comment]: # ({/f91807bf-fef95b5b})

[comment]: # ({ef57e195-f6f7d5a8})
##### Пример 7: Конвертујте Apache статус у JSON

Конвертујте вредност примљену од ставке Zabbix агента [web.page.get](/manual/config/items/itemtypes/zabbix_agent#web.page.gethostpathport) (нпр. web.page.get[http://127.0.0.1:80/server-status?auto]) у JSON објекат.

```javascript
// Претвори Apache статус у JSON

// Поделите вредност на поднизове и ставите ове поднизове у низ
var lines = value.split('\n');

// Креирајте празан објекат "излаз"
var output = {};

// Креирајте објекат "радници" са унапред дефинисаним својствима
var workers = {
    '_': 0, 'S': 0, 'R': 0, 'W': 0,
    'K': 0, 'D': 0, 'C': 0, 'L': 0,
    'G': 0, 'I': 0, '.': 0
};

// Додајте подстрингове из низа "линије" у објекат "излаз" као својства (парови кључ-вредност)
for (var i = 0; i < lines.length; i++) {
    var line = lines[i].match(/([A-z0-9 ]+): (.*)/);

    if (line !== null) {
        output[line[1]] = isNaN(line[2]) ? line[2] : Number(line[2]);
    }
}

// Мултиверзија метрика
output.ServerUptimeSeconds = output.ServerUptimeSeconds || output.Uptime;
output.ServerVersion = output.ServerVersion || output.Server;

// Рашчлањује својство "Scoreboard" да бисте добили број радника
if (typeof output.Scoreboard === 'string') {
    for (var i = 0; i < output.Scoreboard.length; i++) {
        var char = output.Scoreboard[i];

        workers[char]++;
    }
}

// Додајте податке радника у објекат "излаз".
output.Workers = {
    waiting: workers['_'], starting: workers['S'], reading: workers['R'],
    sending: workers['W'], keepalive: workers['K'], dnslookup: workers['D'],
    closing: workers['C'], logging: workers['L'], finishing: workers['G'],
    cleanup: workers['I'], slot: workers['.']
};

// Врати JSON стринг
return JSON.stringify(output);
```

Вредност коју прихвата функција:

    HTTP/1.1 200 OK
    Date: Mon, 27 Mar 2023 11:08:39 GMT
    Server: Apache/2.4.52 (Ubuntu)
    Vary: Accept-Encoding
    Content-Encoding: gzip
    Content-Length: 405
    Content-Type: text/plain; charset=ISO-8859-1

    127.0.0.1
    ServerVersion: Apache/2.4.52 (Ubuntu)
    ServerMPM: prefork
    Server Built: 2023-03-08T17:32:01
    CurrentTime: Monday, 27-Mar-2023 14:08:39 EEST
    RestartTime: Monday, 27-Mar-2023 12:19:59 EEST
    ParentServerConfigGeneration: 1
    ParentServerMPMGeneration: 0
    ServerUptimeSeconds: 6520
    ServerUptime: 1 hour 48 minutes 40 seconds
    Load1: 0.56
    Load5: 0.33
    Load15: 0.28
    Total Accesses: 2476
    Total kBytes: 8370
    Total Duration: 52718
    CPUUser: 8.16
    CPUSystem: 3.44
    CPUChildrenUser: 0
    CPUChildrenSystem: 0
    CPULoad: .177914
    Uptime: 6520
    ReqPerSec: .379755
    BytesPerSec: 3461.58
    BytesPerReq: 3461.58
    DurationPerReq: 21.2916
    BusyWorkers: 2
    IdleWorkers: 6
    Scoreboard: ____KW__..............................................................................................................................................

Вредност коју враћа функција:

```json
{
    "Date": "Mon, 27 Mar 2023 11:08:39 GMT",
    "Server": "Apache/2.4.52 (Ubuntu)",
    "Vary": "Accept-Encoding",
    "Encoding": "gzip",
    "Length": 405,
    "Type": "text/plain; charset=ISO-8859-1",
    "ServerVersion": "Apache/2.4.52 (Ubuntu)",
    "ServerMPM": "prefork",
    "Server Built": "2023-03-08T17:32:01",
    "CurrentTime": "Monday, 27-Mar-2023 14:08:39 EEST",
    "RestartTime": "Monday, 27-Mar-2023 12:19:59 EEST",
    "ParentServerConfigGeneration": 1,
    "ParentServerMPMGeneration": 0,
    "ServerUptimeSeconds": 6520,
    "ServerUptime": "1 hour 48 minutes 40 seconds",
    "Load1": 0.56,
    "Load5": 0.33,
    "Load15": 0.28,
    "Total Accesses": 2476,
    "Total kBytes": 8370,
    "Total Duration": 52718,
    "CPUUser": 8.16,
    "CPUSystem": 3.44,
    "CPUChildrenUser": 0,
    "CPUChildrenSystem": 0,
    "CPULoad": 0.177914,
    "Uptime": 6520,
    "ReqPerSec": 0.379755,
    "BytesPerSec": 1314.55,
    "BytesPerReq": 3461.58,
    "DurationPerReq": 21.2916,
    "BusyWorkers": 2,
    "IdleWorkers": 6,
    "Scoreboard": "____KW__..............................................................................................................................................",
    "Workers": {
        "waiting": 6,
        "starting": 0,
        "reading": 0,
        "sending": 1,
        "keepalive": 1,
        "dnslookup": 0,
        "closing": 0,
        "logging": 0,
        "finishing": 0,
        "cleanup": 0,
        "slot": 142
    }
}
```

[comment]: # ({/ef57e195-f6f7d5a8})
