Come pulire SSJS (Server Side Javascript) nel server Domino dopo che qualcuno ha utilizzato il prototipo javascript in un nsf?Come pulire SSJS nel server Domino dopo che qualcuno ha utilizzato il prototipo javascript in un nsf?
Mark Roden ha scoperto un huge weakness in XPages SSJS: (grazie a David Leedy per avermi parlato di questo e mostrarmi l'articolo).
Se avete il seguente codice SSJS:
var dummyObj = {}
dummyObj.prototype.NAME = "Johann"
XPages SSJS non si cura che si usa var (var significa che la variabile deve essere locale) e rende dummyObj.NAME visibile l'intero server con il valore Johann. Quindi, se un altro NSF nello stesso server utilizza un var con lo stesso nome che eredita l'intero prototipo:
var dummyObj = {}
println(dummyObj.NAME) /*prints "Johann" */
Questo è un enorme bug (uno che fa inaffidabile XPages SSJS IMO). Anche se non si utilizza il prototipo a tutti, se qualcun altro nella sua domanda di fare qualcosa di simile:
String.prototype.split = function(){ return "I broke this method" }
sarà rotto tutte le applicazioni nello stesso server che utilizza l'innocente split().
Quindi, la domanda è: se qualcuno "per errore", scrive quanto segue SSJS (XPages Server Side JavaScript) in un NSF:
String.prototype.split = function(){ return "I broke this method" }
Come posso risolvere String.prototype.split() per la sua valore originale?
Come ha detto Mark Roden, il riavvio dell'attività HTTP non lo risolve.
////////////////////////////////////////////// /////////////
Edit 1: Perché credo che questo sia un enorme errore:
sono un fan Javascript ma IMHO @MarkyRoden ha scoperto un enorme bug in SSJS . Shim e polyfill non sono davvero il problema principale. Eval è noto per essere una cattiva pratica, ma l'oggetto prototipo è un elemento fondamentale del Javascript di base. È il metodo standard e preferito per aggiungere metodi alle classi Javascript, è anche necessario per l'ereditarietà e ogni tipo di OOP stuff. Quindi avrai bisogno di una sorta di spazio dei nomi a livello di server per evitare collisioni. Tutto questo è davvero pessimo, ma l'enorme problema è che solo una riga di codice in un'applicazione può rompere tutte le applicazioni in un server. Sì, puoi fidarti dei tuoi sviluppatori, ma uno di loro può scrivere una riga errata per sbaglio e anche un server Domino può avere centinaia di applicazioni da diversi fornitori di software. Impostare la responsabilità nelle revisioni del codice non è una procedura abbastanza affidabile. Forse è il momento di avere un vero motore javascript in SSJS, come V8, Spidermonkey, Chakra o Rhino. Come soluzione, sto pensando a qualcosa come Tommy Valand idea with Rhino in SSJS.
Modifica 2: è ancora peggio.Si possono fare cose come:
prototype.importPackage = null
o
prototype.Array = null
Come si può vedere nel @ articolo di SvenHasselbach: http://hasselba.ch/blog/?p=1371
Edit 3: IBM: mi hai detto che potevo usare SSJS. VIENI UNO! PER FAVORE FISSARE QUESTO, È FANTASTICO. Si prega di segnalare ufficialmente questo problema a IBM.
Per quanto riguarda i tuoi commenti EDIT. Penso che il key take away sia che SSJS NON è "true JavaScript". Quindi è necessario gestire le vostre aspettative di SSJS di conseguenza. Soprattutto con OOP. Non puoi davvero fare oggetti in SSJS. Se inserisci il codice nelle tue funzioni, non sono serializzabili. Onestamente, credo che la vera soluzione sia usare Java piuttosto che SSJS. –
È un motivo in più per utilizzare il più possibile Java ed EL nello sviluppo di XPage anziché SSJS. –
Sono d'accordo con Knut e David. Prendi in considerazione anche ciò che Jesse Gallagher ha fatto alcuni anni fa per permetterti di codificare Ruby in XPages: XPages è una piattaforma basata su JSF, in esecuzione in una Java Virtual Machine, quindi per consentire alle persone di codificare Ruby, Jesse ha dovuto scrivere un motore di analisi per consentire Java per analizzare Ruby. Il parser di Rhino sta facendo la stessa cosa: sta usando una classe Java per dire a Java come analizzare Rhino. Quindi, a meno che non stia fraintendendo le cose, non puoi avere un vero motore javascript in SSJS, perché utilizzerai un parser Java per quel motore javascript. Il debug può anche essere una sfida. –