JavaScript-modul betöltése URL-ről az IMPORT()-tal
Az IMPORT(url, [callback]) letölt egy JavaScript-fájlt, elmenti az alkalmazás tmp mappájába, és visszaadja, amit a fájl exportál (module.exports), ahogyan a require() tenné. Callbackkel callback(err, module, response); nélküle az IMPORT() a modulra egy promise-t ad vissza. A cím megjegyződik: az IMPORT() ugyanazzal a címmel történő újrahívása nem tölti le újra a fájlt, hanem a tmp-ben lévőt tölti be require-rel (és a fájl az újraindítások között ott marad, a „már letöltve” emléke viszont nem: újraindítás után újra letöltődik).
Ez a hálózatról érkező kódot futtatja az alkalmazás összes jogosultságával. Csak olyan címről importáljon, amelyet Ön ellenőriz és https-en ér el, soha nem olyanról, amelyet egy felhasználó küldött, vagy amelyet bárki más megváltoztathat. A fájl CommonJS-modul. A válasz állapotát nem ellenőrzi: a 404-gyel (vagy bármilyen hibaoldallal) válaszoló címet úgy menti el, mintha az lenne a modul, és a require() a letöltésen belül SyntaxError-t dob, így a total5 0.0.19 verzióban a callback sosem hívódik meg, a promise pedig sosem teljesül. Mindig adjon az IMPORT()-nak saját időkorlátot, ahogyan az utolsó útvonal teszi, és ellenőrizze a címet, mielőtt támaszkodna rá.
Itt a fájl ugyanazon alkalmazás egyik útvonaláról jön, így a példának nincs szüksége hálózatra. Az útvonal számolja a letöltéseket.
exports.install = function() {
ROUTE('GET /lib/tax/', lib);
ROUTE('POST /use/', use);
ROUTE('POST /use-twice/', use_twice);
ROUTE('POST /missing/', missing);
ROUTE('GET /downloads/', downloads);
};
let count = 0;
function lib($) {
count++;
$.plain('module.exports = { vat: function(price) { return Math.round(price * 121) / 100; } };');
}
function downloads($) {
$.json({ downloads: count });
}
function base() {
return 'http://127.0.0.1:' + CONF.$port;
}
async function use($) {
const tax = await IMPORT(base() + '/lib/tax/');
$.json({ price: tax.vat(100) });
}
function use_twice($) {
IMPORT(base() + '/lib/tax/', function(err, tax) {
$.json({ err: err ? err.toString() : null, price: tax ? tax.vat(200) : null });
});
}
async function missing($) {
// the address does not exist: the answer is the 404 page of the application
const winner = await Promise.race([
IMPORT(base() + '/lib/missing/').then(() => 'answered', () => 'answered'),
new Promise(resolve => setTimeout(() => resolve('no answer'), 1500))
]);
$.json({ result: winner });
}