Update eject example to something more robust
- Lingua principale
- JavaScript
- Stelle
- 733
- Fork
- 177
- Merge medio
- 1g 20h
- PR unite (30g)
- 3
Descrizione
### Prerequisites
- [X] I have written a descriptive issue title
- [X] I have searched existing issues to ensure the feature has not already been requested
### 🚀 Feature Proposal
Change the eject file example to validate everything before running the server and make use of the `.ready()` function.
### Motivation
What made me think of this approach are:
- Fastify encapsulation concept, the server should not run if something goes wrong with `plugins` and are not loaded inside correctly inside Fastify.
- The struggle I've been in the past few days trying to use Fastify in a complex real-world project and I didn't find clear examples.
- easier to handle errors, if something goes wrong Fastify will throw the valid error not some error buried deep inside the router or hooks
- the unclear error "cannot read properties of undefined (reading 'length')" which was happening for several reasons and I cannot detect them until i throw error on startup
### Example
```ts
// Read the .env file.
import * as dotenv from "dotenv";
dotenv.config();
// Require the framework
import Fastify from "fastify";
// Require library to exit fastify process, gracefully (if possible)
import closeWithGrace from "close-with-grace";
// Instantiate Fastify with some config
const app = Fastify({
logger: true,
});
// make use of the `.ready()` to prevent going on race condition
fastify.register(app).ready((err) => {
// throw error if something happened on registering `plugins` or `routes`
if (err) throw err;
// delay is the number of milliseconds for the graceful close to finish
const closeListeners = closeWithGrace(
{
delay:
parseInt(process.env.FASTIFY_CLOSE_GRACE_DELAY as string) ||
500,
},
async function ({ signal, err, manual }) {
if (err) {
fastify.log.error(err);
}
await fastify.close();
} as closeWithGrace.CloseWithGraceAsyncCallback
);
fastify.addHook("onClose", async (instance, done) => {
closeListeners.uninstall();
done();
});
//server listen
const port = process.env.PORT || 8000;
// Start listening.
fastify.listen({ port: parseInt(port as string) }, (err: any) => {
if (err) {
fastify.log.error(err);
process.exit(1);
}
});
});
```
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
La issue non indica il file di template di eject né un test; inizia individuando l’esempio di eject in fastify-cli e verificando come l’applicazione generata registra i plugin e avvia il server. Aggiorna l’esempio in modo da convalidare la registrazione prima di iniziare l’ascolto e mostrare `.ready()`; il lavoro è terminato quando l’esempio generato riflette questo flusso e i controlli pertinenti hanno esito positivo.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- node.js, typescript
- Ambito
- cli, documentation
- Tipo di issue
- Documentazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100