[comment]: # translation:outdated

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

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

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

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

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

[comment]: # ({1a912b43-076d2285})
### Претходна обрада ЈаваСкрипта

Претходна обрада ЈаваСкрипта се врши позивањем ЈаваСкрипт функције са
једним параметром 'вредност' и телом функције које је обезбедио корисник. Резултат
корака претходне обраде је вредност коју враћа ова функција, на пример, да бисте извршили конверзију Фаренхајта у Целзијусе, унесите:

  return (value - 32)  * 5 / 9

у параметре претходне обраде ЈаваСкрипта, који ће бити упаковани у
ЈаваСкрипт функцију од стране сервера:

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

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

-  враћање недефинисане вредности резултираће грешком;
-  враћање нулте вредности ће узроковати одбацивање улазне вредности,
слично као претходна обрада 'Одбаци вредност' при акцији 'Прилагођено при неуспеху'.

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

На пример:

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

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

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

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

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

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

[comment]: # ({/1a912b43-076d2285})

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

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

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

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

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

[comment]: # ({/da6eebb6-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]: # ({6397a788-f6f7d5a8})
##### Пример 7: Конвертовање Apache статуса у JSON

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

```javascript
// Конвертовање Apache статуса у JSON

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

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

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

// Додај подстрингове из низа „lines“ објекту „output“ као својства (парови кључ-вредност)
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“
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: 6Scoreboard: ____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]: # ({/6397a788-f6f7d5a8})
