Áú»¢¶Ä²©

5 Preprocessament de JavaScript

Vista general

Aquesta secci¨® proveeix detalls del pretractrament per a JavaScript.

Preprocessament de JavaScript

El preprocessament de JavaScript es realitza invocant la funci¨® JavaScript amb un ¨²nic par¨¤metre 'valor' i un cos de funci¨® subministrat per l'usuari. El resultat de la passa de preprocessament ¨¦s el valor que retorna aquesta funci¨®, per exemple, per fer una conversi¨® de Fahrenheit a Celsius, l'usuari introduiria:

return (value - 32) * 5 / 9

als par¨¤metres de preprocessament de JavaScript, que s'embolcallen en una funci¨® JavaScript per servidor:

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

El par¨¤metre d'entrada 'valor' sempre es passa com a cadena. El valor de retorn es converteix autom¨¤ticament a una cadena mitjan?ant el m¨¨tode toString() (si falla, l'error es retorna com a valor de cadena), amb algunes excepcions:

  • retornar un valor no definit donar¨¤ lloc a un error
  • retornar un valor nul far¨¤ que el valor d'entrada s'esborri, de la mateixa manera que el preprocessament 'Esborra el valor' a l'acci¨® 'Personalitzar en cas d'error'.

Els errors es poden retornar iniciant valors/objectes (normalment cadenes o objectes d'error).

Per exemple:

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

Cada script t¨¦ un temps d'espera d'execuci¨® de 10 segons (depenent de l'script, el temps d'espera pot trigar m¨¦s a activar-se); superar-lo retornar¨¤ un error. S'aplica un l¨ªmit d'emmagatzematge din¨¤mic de 512 Mo.

El bytecode de la passa de preprocessament de JavaScript s'emmagatzema a la mem¨°ria cau i es reutilitza la propera vegada que s'aplica el pas. Qualsevol canvi als passos de preprocessament de l'element far¨¤ que l'script desat a la mem¨°ria cau es restableixi i es torni a compilar posteriorment.

Els errors d'execuci¨® consecutius (3 de seguits) faran que el motor es restableixi per esmorteir la possibilitat que un script trenqui l'entorn d'execuci¨® per als scripts posteriors (aquesta acci¨® es registra amb DebugLevel a 4 i posteriors).

El preprocessament de JavaScript s'implementa amb el motor JavaScript de Duktape ().

Veieu tamb¨¦: Objectes JavaScript addicionals i funcions globals

Emprar macros als scripts

?s possible emprar macros d'usuari al codi JavaScript. Si un script cont¨¦ macros d'usuari, aquestes macros les resol el servidor/proxy abans de realitzar passes espec¨ªfiques de preprocessament. Tingueu en compte que quan proveu les passes de preprocessament a la interf¨ªcie web, els valors de macro no s'extreuran i caldr¨¤ introduir-los manualment.

El context s'ignora quan se substitueix una macro pel seu valor. El valor de la macro s'insereix tal com ¨¦s al codi, no ¨¦s possible afegir una escapada addicional abans de col¡¤locar el valor al codi JavaScript. Tingueu en compte que aix¨° pot provocar errors de JavaScript en alguns casos.

A l'exemple seg¨¹ent, si el valor rebut supera un valor de macro {$THRESHOLD}, es retornar¨¤ el valor de llindar (si ¨¦s present):

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

Exemples

Els exemples seg¨¹ents il¡¤lustren com podeu emprar el preprocessament de JavaScript.

Cada exemple cont¨¦ una breu descripci¨®, un cos de la funci¨® per als par¨¤metres de preprocessament de JavaScript i el resultat de la passa de preprocessament: valor retornat per la funci¨®.

Exemple 1: Convertir un nombre (notaci¨® cient¨ªfica a enter)

Converteix el nombre "2.62128e+07" de notaci¨® cient¨ªfica a enter.

return (Number(value))

Valor retornat per la funci¨®: 26212800.

Exemple 2: Converteix un nombre (binari a decimal)

Converteix el nombre binari "11010010" a un nombre decimal.

return(parseInt(value,2))

Valor retornat per la funci¨®: 210.

Exemple 3: Arrodonir un nombre

Arrodoneix el nombre "18.2345" a 2 d¨ªgits.

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

Valor retornat per la funci¨®: 18.23.

Exemple 4: Comptar lletres d'una cadena

compta el nombre de lletres de la cadena "Áú»¢¶Ä²©".

return (value.length)

Valor retornat per la funci¨®: 6.

Example 5: Obtindre el temps restant

Obt¨¦ el temps restant (en segons) fins la data d'expiraci¨® del certificat (Feb 12 12:33:56 2022 GMT).

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);

Valor retornat per la funci¨®: 44380233.

Example 6: Esborrar les propietats JSON

Modifica l'estructura de dades JSON esborrant qualsevol propietat amb la clau "data_size" o "index_size".

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)

Value accepted by the function:

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

Valor retornat per la funci¨®:

[
           {
               "table_name":"history"
           },
           {
               "table_name":"history_log"
           }
       ]
Exemple 7: Convertir l'estat Apache a JSON

Converteix el valor rebut d'un element d'agent Áú»¢¶Ä²© web.page.get (p. ex., web.page.get[http://127.0.0.1 :80/server-status?auto]) a un objecte JSON.

// Converteix l'estat Apache a JSON
       
       // Divideix el valor en subcadenes i posa aquestes subcadenes en una matriu
       var lines = value.split('\n');
       
       // Crea un objecte buit "output"
       var output = {};
       
       // Crea un objecte "workers" amb les propietats predefinides
       var workers = {
           '_': 0, 'S': 0, 'R': 0, 'W': 0,
           'K': 0, 'D': 0, 'C': 0, 'L': 0,
           'G': 0, 'I': 0, '.': 0
       };
       
       // Afegiu les subcadenes de la matriu "l¨ªnies" a l'objecte "sortida" com a propietats (parelles clau-valor)
       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]);
           }
       }
       
       // M¨¨triques multiversi¨®
       output.ServerUptimeSeconds = output.ServerUptimeSeconds || output.Uptime;
       output.ServerVersion = output.ServerVersion || output.Server;
       
       // Analitza la propietat "Tauler de marcador" per obtindre el recompte de treballadors
       if (typeof output.Scoreboard === 'string') {
           for (var i = 0; i < output.Scoreboard.length; i++) {
               var char = output.Scoreboard[i];
       
               workers[char]++;
           }
       }
       
       // Afegeix informaci¨® del treballador a l'objecte "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['.']
       };
       
       // Retorna una cadena JSON
       return JSON.stringify(output);

Valor acceptat per la funci¨®:

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__..............................................................................................................................................

Valor retornat per la funci¨®:

{
           "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
           }
       }