Estoy usando express y express-ws en una aplicación de nodo. Sin embargo, express-ws parece estar silenciando los errores, lo que dificulta mucho la depuración de mi código.
He reducido mi código a lo siguiente, que aún reproduce el problema:
// configure express var express = require('express'); var app = express(); var expressWs = require('express-ws')(app); // set up routes app.get('/', function(req, res) { console.log("GET"); nonExistingFunction(); // Called to demonstrate a traceback is provided. }); app.ws('/', function(ws, req){ console.log("WS"); nonExistingFunction(); // Called to demonstrate this error is silenced. }); // start service app.listen(90);Cuando OBTENGO desde un navegador, la consola muestra el mensaje de registro 'OBTENER' seguido del rastreo (como se esperaba). Es decir;
GET ReferenceError: nonExistingFunction is not defined at C:\(project dir)\server.js:11:9 at Layer.handle [as handle_request] (C:\(project dir)\node_modules\express\lib\router\layer.js:95:5) at next (C:\(project dir)\node_modules\express\lib\router\route.js:137:13) at Route.dispatch (C:\(project dir)\node_modules\express\lib\router\route.js:112:3) at Layer.handle [as handle_request] (C:\(project dir)\node_modules\express\lib\router\layer.js:95:5) at C:\(project dir)\node_modules\express\lib\router\index.js:281:22 at Function.process_params (C:\(project dir)\node_modules\express\lib\router\index.js:335:12) at next (C:\(project dir)\node_modules\express\lib\router\index.js:275:10) at expressInit (C:\(project dir)\node_modules\express\lib\middleware\init.js:40:5) at Layer.handle [as handle_request] (C:\(project dir)\node_modules\express\lib\router\layer.js:95:5)Cuando me conecto a través de Websocket, la consola solo muestra el mensaje de registro 'WS', sin rastreo. Es decir;
WS¿Express-ws silencia los errores de forma predeterminada? ¿Hay alguna manera de apagarlo?
Tengo una solución.
Express tiene su propio controlador de errores predeterminado que envía el seguimiento a la consola pero permite que la aplicación continúe ejecutándose. Express-ws usa un nido try-catch para hacer lo mismo en wrap-middleware.js .
try { /* Unpack the `.ws` property and call the actual handler. */ middleware(req.ws, req, next); } catch (err) { /* If an error is thrown, let's send that on to any error handling */ next(err); } Sin embargo, esto no parece pasarse al controlador de errores predeterminado. Entonces, en su lugar, puede especificar un middleware de controlador de errores para la app . Este debe ser el último middleware de la cadena. El siguiente código es un poco complicado, pero generará seguimientos a la consola independientemente de si el error ocurrió dentro de una función de ruta HTTP o WS.
// configure express var express = require('express'); var app = express(); var expressWs = require('express-ws')(app); // set up routes app.get('/', function(req, res) { console.log("GET"); nonExistingFunction(); // Called to demonstrate a traceback is provided. }); app.ws('/', function(ws, req){ console.log("WS"); nonExistingFunction(); // Called to demonstrate this error is no longer silenced :) }); // set up error handler function errorHandler (err, req, res, next) { if(req.ws){ console.error("ERROR from WS route - ", err); } else { console.error(err); res.setHeader('Content-Type', 'text/plain'); res.status(500).send(err.stack); } } app.use(errorHandler); // start service app.listen(90);