Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript express ws正在消除错误_Javascript_Node.js_Express - Fatal编程技术网

Javascript express ws正在消除错误

Javascript express ws正在消除错误,javascript,node.js,express,Javascript,Node.js,Express,我正在节点应用程序中使用express和express ws。然而,expressws似乎正在消除错误,这使得调试代码变得非常困难 我已将代码缩减为以下内容,但仍然会重现问题: // configure express var express = require('express'); var app = express(); var expressWs = require('express-ws')(app); // set up routes app.get('/', function(

我正在节点应用程序中使用express和express ws。然而,expressws似乎正在消除错误,这使得调试代码变得非常困难

我已将代码缩减为以下内容,但仍然会重现问题:

// 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);
当我从浏览器获取时,控制台会显示“获取”日志消息,然后是回溯(如预期的那样)。即,

当我通过Websocket连接时,控制台只显示“WS”日志消息- 没有追踪。即,

WS
默认情况下express ws-silence是否存在错误?有办法把它关掉吗?

我有一个解决办法

Express有自己的默认错误处理程序,它将回溯输出到控制台,但允许应用程序继续运行。expressws在
wrap middleware.js
中使用try-catch嵌套来执行相同的操作

  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);
  }
但是,这似乎并没有传递给默认的错误处理程序。因此,您可以为
app
指定一个错误处理程序中间件。这必须是链中的最后一个中间件。下面的代码有点粗制滥造,但不管错误是发生在HTTP还是WS-route函数中,都会将回溯输出到控制台

// 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);

您能提供一个跟踪消息示例吗?另外,为什么要使用
控制台
进行调试?为什么不是一个节点调试器?我只是使用console.log作为一个快速简单的测试,以确保相关功能得到执行。我用控制台输出编辑了这个问题,但更重要的是WS-connection根本不提供预期的回溯,所以当我的代码出现问题时,要找出ws-route函数中失败的地方变得非常困难。
// 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);