I want to ensure there is no brute (sub-)process termination and that any open requests are fulfilled when the Express server is closing.
// POST endpoint to process the shopping cart
app.post('/purchase', (req, res) => {
// Get the items from the request body
try {
const { buyer, items } = req.body;
// Process the items (e.g., calculate total price, initiate payment, etc.)
const totalPrice = calculateTotalPrice(items);
// Charge the buyer for the purchase
const payment = chargeBuyerForPurchase(totalPrice);
// π₯· I don't want the server to close before it executes this line for every request
// Create shipping for the purchased items
const shipping = carrierAPI.createShipping(items, buyer.address);
res.status(200).json([totalPrice, payment, shipping]);
// πββοΈ This is now safe to close the server
} catch (error) {
next(error);
}
});
// ./src/app.ts
import process from 'node:process';
// Begin reading from stdin so the process does not exit.
process.stdin.resume();
process.on('SIGINT', () => {
console.log('Received SIGINT. Press Control-D to exit.');
});
// FYI docker "stop" <container>, a process manager, and most hosts will send SIGTERM signal when it is shutting down.
// server.close stops the server from accepting new connections and closes all connections connected to this server that are not sending a request or waiting for a response
function gracefulClose(signal) {
console.log(`Received ${signal}`);
const server = this.app.listen(this.port, () => { ... } );
server.close( () => { log('HTTP(S) server closed') } );
}
process.on('SIGINT', gracefulClose);
process.on('SIGTERM', gracefulClose);
Is it a feature to implement? Is this feature redundant?
Graceful close
Motivation
I want to ensure there is no brute (sub-)process termination and that any open requests are fulfilled when the Express server is closing.
Proposed Solution
See documentation at this link
Is it a feature to implement? Is this feature redundant?