ForgeTotal.js 5
hu

Total.js 5

JavaScript-modul betöltése URL-ről az IMPORT()-tal

Total.js 5 · total5@0.0.19 modulesdownloaddependencies Total.js 5-tel lefuttatva

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.

controllers/import.js
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 });
}