ForgeTotal.js 5
hu

Total.js 5

Külső szolgáltatások hívása az API()-val és a NEWAPI() driverekkel

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

Az API(name, schema, data, [$]) egy külső szolgáltatás egy műveletét hívja meg, a NEWAPI() pedig azt a drivert regisztrálja, amely a hívást végrehajtja, így a műveletei kódja nem függ attól, hogyan érik el a szolgáltatást (HTTP, egy könyvtár, egy sor...).

  • A NEWAPI('name', driver) a name szolgáltatás driverét regisztrálja (az 'a,b' egy drivert regisztrál két névhez, a NEWAPI(driver) pedig az alapértelmezettet, a default-ot). A NEWAPI('name', config, driver) egy config objektumot is eltárol, amelyet minden hívás options.config néven kap meg.
  • A driver egy function(options, next). Az options.name a szolgáltatás, az options.schema a művelet, az options.data az adat, az options.config pedig a konfiguráció. Válaszoljon a next(error, response) hívással.
  • Az API('name', 'operation', data) egy buildert ad vissza: fejezze be a .callback($) (a válasz a $ műveletnek megy), a .callback(function(err, response) {}) vagy az await ....promise($) hívással. A .configure({ key: value }) az adott híváshoz hozzáad az options.config-hoz, a .error('text') pedig azt éri el, hogy egy üres válasz ezzel az üzenettel hibásodjon meg.
  • Ha a névhez nincs driver regisztrálva, a hívás API is not initialized hibával végződik.
definitions/api.js
// The driver of a fake weather service: in a real one this would be an HTTP request
NEWAPI('weather', { unit: 'C' }, function(options, next) {
	if (options.schema === 'forecast')
		next(null, { city: options.data.city, temperature: 21, unit: options.config.unit, service: options.name });
	else
		next('Unknown operation ' + options.schema);
});
controllers/weather.js
exports.install = function() {
	ROUTE('GET /forecast/', forecast);
	ROUTE('GET /forecast-fahrenheit/', fahrenheit);
	ROUTE('GET /unknown/', unknown);
	ROUTE('GET /missing/', missing);
	ROUTE('GET /promise/', promise);
};

function forecast($) {
	API('weather', 'forecast', { city: $.query.city }).callback($);
}

function fahrenheit($) {
	API('weather', 'forecast', { city: $.query.city }).configure({ unit: 'F' }).callback($);
}

function unknown($) {
	API('weather', 'rain', {}).callback($);
}

function missing($) {
	API('nobody', 'forecast', {}).callback($);
}

async function promise($) {
	const data = await API('weather', 'forecast', { city: 'Oslo' }).promise($);
	$.json({ city: data.city, same: true });
}