Aquesta secci¨® proveeix detalls del pretractrament per a 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:
als par¨¤metres de preprocessament de JavaScript, que s'embolcallen en una funci¨® JavaScript per servidor:
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:
Els errors es poden retornar iniciant valors/objectes (normalment cadenes o objectes d'error).
Per exemple:
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
?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;
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¨®.
Converteix el nombre "2.62128e+07" de notaci¨® cient¨ªfica a enter.
Valor retornat per la funci¨®: 26212800.
Converteix el nombre binari "11010010" a un nombre decimal.
Valor retornat per la funci¨®: 210.
Arrodoneix el nombre "18.2345" a 2 d¨ªgits.
Valor retornat per la funci¨®: 18.23.
compta el nombre de lletres de la cadena "Áú»¢¶Ä²©".
Valor retornat per la funci¨®: 6.
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.
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¨®:
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
}
}