fastify / fastify/fastify-cli

Update eject example to something more robust

Open
#616 4 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
733
Forks
177
Avg merge
1d 20h
Merged PRs (30d)
3

Description

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

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.