From 7f378115b54662240a1b5647f6ac70c590824e53 Mon Sep 17 00:00:00 2001 From: Sjoerd de Vries Date: Sat, 5 Sep 2026 15:53:20 +0200 Subject: [PATCH] fix: guard the async /check-now handler against crashing (finding 8) Express 4 geeft een afgewezen promise uit een async handler niet door aan de error-handling; met Node 22 crashte daardoor het hele proces. De handler vangt de fout nu zelf af, logt hem en antwoordt met een 500. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_013gwc3aCiyQxmCWQke8RvEz --- src/app.js | 13 ++++++++++--- test/app.test.js | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/app.js b/src/app.js index 746c055..c2b589e 100644 --- a/src/app.js +++ b/src/app.js @@ -31,10 +31,17 @@ function createApp(deps) { res.redirect('/'); }); + // Express 4 vangt een afgewezen promise uit een async handler niet af, en + // Node 22 laat het proces daarop crashen — dus zelf afvangen. app.post('/check-now', async (req, res) => { - const products = listProducts(); - await checkAllProducts(products); - res.redirect('/?checked=1'); + try { + const products = listProducts(); + await checkAllProducts(products); + res.redirect('/?checked=1'); + } catch (err) { + console.error(`[check-now] mislukt: ${err && err.message}`); + res.status(500).send('Er ging iets mis bij het controleren van de prijzen.'); + } }); return app; diff --git a/test/app.test.js b/test/app.test.js index a85b7a3..02d1f90 100644 --- a/test/app.test.js +++ b/test/app.test.js @@ -69,3 +69,19 @@ test('check-now triggers checkAllProducts and redirects with confirmation', asyn assert.equal(res.headers.location, '/?checked=1'); assert.equal(called, true); }); + +test('check-now answers 500 when the check fails, without crashing the process', async (t) => { + t.mock.method(console, 'error', () => {}); + const deps = makeDeps({ + checkAllProducts: async () => { throw new Error('db weg'); }, + }); + deps.addProduct({ name: 'Nog steeds hier', url: 'https://shop.example/p3' }); + const app = createApp(deps); + const res = await request(app).post('/check-now').auth('admin', 'secret'); + assert.equal(res.status, 500); + assert.match(res.text, /Er ging iets mis/); + // Same process, same app instance: proves nothing crashed. + const list = await request(app).get('/').auth('admin', 'secret'); + assert.equal(list.status, 200); + assert.match(list.text, /Nog steeds hier/); +});