Je suis en train de configurer un simple serveur de nœuds express.js et je n'arrive pas à faire fonctionner mon gestionnaire d'erreurs personnalisé. Il semble qu'il ne soit pas du tout appelé et à la place, un gestionnaire d'erreurs express.js par défaut est appelé.
Notez que cela est en script et utilise mongodb, si cela compte (ne pensez pas que cela devrait). Voici le code pertinent:
index.ts:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Error</title> </head> <body> <pre>[object Object]</pre> </body> </html>
routes / index.ts:
Successfully connected to database. Server is up and running on port 1234 found an error GET /data 500 35.289 ms - 142 // this is from morgan logging [object Object] // no idea where this is coming from, i assume express default error handler
routes/data.ts:
import { Router } from 'express'; import Data from './models/Data'; const router = Router(); router.get('/', (_, res, next) => { Data.find((error, data) => { if (error) { console.log('found an error') next({ status: 500, message: 'got an error' }); return; } res.send(`Got data: ${JSON.stringify(data.map(datum => datum.toJSON()))}`); }); }); export default router;
Lorsque je démarre le serveur, puis j'envoie une requête GET au point de terminaison / data à l'aide de postman, c'est la sortie sur le serveur :
import { Router } from 'express'; import dataRoutes from './data.ts'; const router = Router(); router.use('/data', dataRoutes); export default router;
Et voici la valeur de retour que je vois dans postman:
import routes from './routes/index.ts'; import express, { Request, Response, NextFunction } from 'express'; // other imports... type ServerErrror = { status: number; message: string; } const app = express(); // set up logging... app.use(bodyParser.json()); app.use('/', routes); app.use((err: ServerError, req: Request, res: Response, next: NextFunction) => { // eslint-disable-line no-unused-vars console.error('in error handler'); res.status(err.status).send(`got error: ${err.message}`); }); mongoose.connect(MONGODB_URI) .then(() => { console.log('Successfully connected to database.'); app.listen(SERVER_PORT, () => { console.log(`Server is up and running on port ${SERVER_PORT}`); }).on('error', error => { console.log('Error starting server:', error); }); }, error => { console.log('Error connecting to database:', error); });
Encore une fois, je ne sais pas d'où cela vient de. Je suppose qu'il doit s'agir du gestionnaire d'erreurs par défaut express.
3 Réponses :
Il y a quelques problèmes avec votre code:
les routes d'importation depuis './routes/index.ts'
ne doivent pas avoir l'extension * .ts
. import dataRoutes from './data.ts';
ne doit pas avoir l'extension * .ts
. ServerErrror
contient une lettre de trop. Voici un petit exemple qui fonctionne sur ma machine. J'ai supprimé le code lié à Mongoose et modifié l'exemple afin qu'il soit facile à reproduire dans un seul fichier. Un appel à http: // localhost: 5000 / data
renvoie customErrorHandler> dataRoutes.get> Error
, ce dont je pense que vous avez besoin.
"devDependencies": { "@types/express": "^4.16.1", "typescript": "^3.4.1" }, "dependencies": { "express": "^4.16.4" }
Voici mon fichier tsconfig.json:
{ "compilerOptions": { "moduleResolution": "node", "module": "commonjs", "allowSyntheticDefaultImports": true } }
Voici mes dépendances package.json:
import { Request, Response, NextFunction } from 'express'; import bodyParser = require('body-parser'); import express = require('express'); type ServerError = { status: number; message: string; } const dataRoutes = express.Router().get('/', (_, res, next) => { setTimeout(() => { // mimic an asynchronous operation const error = true; if (error) { next({ status: 500, message: 'dataRoutes.get > Error' }); return; } res.send('dataRoutes.get > Success'); }, 1000); }); const routes = express.Router().use('/data', dataRoutes); const app = express(); app.use(bodyParser.json()); app.use('/', routes); app.use((err: ServerError, req: Request, res: Response, next: NextFunction) => { res .status(err.status) .send(`customErrorHandler > ${err.message}`); }); app.listen(5000); console.log('Now listening on port 5000');
J'ai copié-collé ce code et l'ai exécuté et il n'appelle toujours pas le gestionnaire d'erreurs personnalisé lorsque j'atteins le point de terminaison. Puis-je vous demander quelle version d'Express vous utilisez? (et body-parser, pourquoi pas)
Sûr. J'ai ajouté les sections package.json et tsconfig.json qui pourraient être intéressantes.
Donc, après beaucoup de recherches, j'ai trouvé le problème. Je vais créer une réponse distincte car votre message ne m'a pas donné la réponse. Cependant, j'ai voté pour votre message / commentaire car il m'a aidé à me guider pendant le processus de débogage.
Pour la postérité: les erreurs que vous avez signalées en haut de votre article n'existent que dans mon article parce que j'essayais de modifier mon code actuel afin de simplifier le code pour stackoverflow. Ce ne sont pas de véritables erreurs que j'ai dû corriger.
Il s'avère que le problème était mon utilisation de babel- preset-minify qui n'a apparemment pas transformé le code correctement. Se débarrasser de ce préréglage a fait fonctionner le code sans aucune autre modification.
Dans mon cas, je désactive l'option babel-preset-minify deadcode
et je fonctionne bien.
{ "presets": [ [ "minify", { "deadcode": false } ] ] }
pouvez-vous
console.log (err)
dans votre gestionnaire d'erreurs et voir la structure@ naga-elixir-jar j'ai déjà une
console.error
là-bas et elle n'est jamais appelée car elle n'y arrive pas