4

我的 app.js 有以下内容:

var express = require('express')
  , http = require('http')
  , path = require('path')
  , redis = require('redis')
  , client = redis.createClient();

var app = express();

app.configure(function(){
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser('your secret here'));
    app.use(express.session());
    app.use(app.router);
    app.use(require('stylus').middleware(__dirname + '/public'));
    app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

require('./routes')(app);

client.on("connect", function () {
    console.log("Client on connect");
});


http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

我所尝试的只是使用node_redis库来连接 Redis 实例。Node.js 和 Redis 都安装在本地。我想指出的一件事是我创建并尝试使用 Jetbrains 的 Webstorm 运行这个项目(因为我想要一个为我提供一些调试功能的 IDE)。字符串 'Client on connect' 已记录到控制台,但我的应用程序几乎每次都会崩溃'Process finished with exit code 139'。我尝试通过命令行运行该应用程序,该应用程序没有崩溃。最糟糕的是,当应用程序无法在 Webstorm 中运行时,没有任何类型的堆栈跟踪。有没有人知道问题是什么,或者我可以在哪里找到有关此错误代码的更多信息?

另外,为了让我们在同一个页面上:我的 Redis 服务器已启动并正在运行,并从另一个自定义 web 应用程序接收持续的数据流。我能够启动 redis-cli,并验证 Redis 是否确实包含任何数据。

4

1 回答 1

3

如果您使用的是 Unix 类型的操作系统,则 139 表示“128 + 您的 Node 进程崩溃的信号编号”。所以在你的情况下,那个信号是 11,在大多数 Unices 上意味着 SIGSEGV。换句话说:Node 进程在某种无效的内存引用上崩溃。

根据我的经验,当您在从 IDE(或其他应用程序)启动进程时遇到此类错误时,通常意味着 IDE 正在传递某种导致崩溃的环境。您可以尝试将 GDB 附加到正在运行的 Node 进程(但在连接到它之前会导致崩溃)以找出导致它的原因。

另一种解决方案:如果您可以更改 Webstorm 将启动的节点可执行文件,您可以尝试制作一个包装 Node 并打印一些调试信息的 shell 脚本。像这样的东西:

#!/bin/sh

echo "ENVIRONMENT: $ENV"
sleep 1
/path/to/actual/node "$@"

这将输出传递给 Node 可执行文件的环境变量。从那里,您可以尝试取消设置任何看起来可疑的变量:

unset STRANGE_VARIABLE

在启动 Node 可执行文件之前,将它们放在上面的脚本中。

于 2013-01-11T06:20:16.550 回答