ForgeTotal.js 5
ro

Total.js 5

Încarcă un modul JavaScript de la un URL cu IMPORT()

Total.js 5 · total5@0.0.19 modulesdownloaddependencies Executată cu Total.js 5

IMPORT(url, [callback]) descarcă un fișier JavaScript, îl salvează în folderul tmp al aplicației și returnează ce exportă fișierul (module.exports), așa cum ar face require(). Cu un callback este callback(err, module, response); fără el, IMPORT() returnează o promisiune pentru modul. Adresa este ținută minte: apelând din nou IMPORT() cu aceeași adresă nu se mai descarcă fișierul, se încarcă cu require cel din tmp (iar fișierul rămâne acolo între reporniri, dar memoria „deja descărcat” nu: după o repornire este descărcat din nou).

Aceasta rulează cod care vine din rețea cu toate drepturile aplicației tale. Importă doar de la o adresă pe care o controlezi și la care ajungi prin https, niciodată de la una trimisă de un utilizator sau pe care o poate schimba oricine altcineva. Fișierul este un modul CommonJS. Starea răspunsului nu este verificată: o adresă care răspunde 404 (sau orice pagină de eroare) este salvată ca și cum ar fi modulul, iar require() aruncă apoi un SyntaxError în timpul descărcării, deci în total5 0.0.19 callbackul nu este apelat niciodată, iar promisiunea nu se rezolvă niciodată. Dă-i întotdeauna lui IMPORT() o limită de timp proprie, așa cum face ultima rută, și verifică adresa înainte să depinzi de ea.

Aici fișierul vine dintr-o rută a aceleiași aplicații, astfel încât exemplul nu are nevoie de rețea. Ruta numără descărcările.

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