# Eseguire in modalità debug e release

> Le opzioni di Total.run() scelgono tra modalità debug e release; leggi la modalità da DEBUG e limita le rotte a una modalità con @debug e @release.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: it
Content-SHA256: 786a18c78db682c49640e367e59ce131e3d2b3d78c1444e94d7118e9516ebda5
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Total.js funziona in una di due modalità, **debug** per lo sviluppo e **release** per il server, e il booleano globale `DEBUG` dice al tuo codice quale è attiva. In modalità debug l'applicazione gira sotto un watcher di file che la riavvia quando modifichi un file, gli errori mostrano dettagli e vengono generate le source map. La modalità release non ha watcher e le pagine di errore non mostrano i dettagli tecnici.

La modalità è scelta da come si avvia l'applicazione, nello script di avvio (`index.js`) che chiama `Total.run(options)`:

- il valore predefinito è debug, con il watcher;
- `options.release = true` avvia la modalità release; lo script di avvio generato da Total.js la imposta dalla riga di comando, quindi `node index.js --release` è il modo di avviare la produzione;
- `options.watcher = false` esegue un singolo processo senza watcher, e quella è sempre la modalità release (è ciò che usano gli esempi di questo ricettario).

Prima che `Total.run()` abbia deciso, `DEBUG` ha un valore predefinito preso da `NODE_ENV`: è `false` quando `NODE_ENV=production` e `true` altrimenti. Il codice che gira al momento del caricamento di un modulo vede quel valore predefinito, quindi non fare affidamento su `NODE_ENV` per la modalità finale, ma solo su `DEBUG` dopo l'avvio dell'applicazione.

Le rotte possono seguire la modalità. Il flag `@debug` fa esistere una rotta solo in modalità debug e `@release` solo in modalità release; nell'altra modalità l'URL risponde 404. Usa `@debug` per gli strumenti che ti servono durante lo sviluppo (un visualizzatore di database, una rotta di dati di prova) così non arriveranno mai in produzione per sbaglio.

```js controllers/mode.js
exports.install = function() {
	ROUTE('GET /mode/', mode);
	ROUTE('GET /tools/ @debug', tools);
	ROUTE('GET /status/ @release', status);
};

function mode($) {
	$.json({ debug: DEBUG });
}

function tools($) {
	$.json({ tools: true });
}

function status($) {
	$.json({ status: 'ok' });
}
```
