ForgeTotal.js 5
sv

Total.js 5

Ladda en JavaScript-modul från en URL med IMPORT()

Total.js 5 · total5@0.0.19 modulesdownloaddependencies Körd med Total.js 5

IMPORT(url, [callback]) laddar ner en JavaScript-fil, sparar den i mappen tmp i applikationen och returnerar det filen exporterar (module.exports), som require() skulle göra. Med en callback är det callback(err, module, response); utan den returnerar IMPORT() ett löfte för modulen. Adressen kommer ihåg: att anropa IMPORT() igen med samma adress laddar inte ner filen igen, utan laddar den i tmp med require (och filen finns kvar där mellan omstarter, men minnet av „redan nedladdad“ gör det inte: efter en omstart laddas den ner igen).

Detta kör kod som kommer från nätverket med alla rättigheter i din applikation. Importera bara från en adress som du kontrollerar och når med https, aldrig en som en användare skickat dig eller som någon annan kan ändra. Filen är en CommonJS-modul. Svarets status kontrolleras inte: en adress som svarar 404 (eller vilken felsida som helst) sparas som om den vore modulen, och require() kastar sedan ett SyntaxError inuti nedladdningen, så i total5 0.0.19 anropas callbacken aldrig och löftet avgörs aldrig. Ge alltid IMPORT() en egen tidsgräns, som den sista routen gör, och kontrollera adressen innan du förlitar dig på den.

Här kommer filen från en route i samma applikation, så att exemplet inte behöver något nätverk. Routen räknar nedladdningarna.

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