我的 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 是否确实包含任何数据。
最佳答案
如果您使用的是 Unix 类型的操作系统,则 139 表示“128 + 您的 Node 进程崩溃的信号编号”。所以在你的例子中,那个信号是 11,在大多数 Unices 上这意味着 SIGSEGV。换句话说:Node 进程因某种无效的内存引用而崩溃。
根据我的经验,如果您在从 IDE(或其他应用程序)启动进程时遇到此类错误,通常意味着 IDE 正在通过某种导致崩溃的环境。您可以尝试将 GDB 附加到正在运行的 Node 进程(但在连接到它之前,导致崩溃)以找出导致它的原因。
另一个解决方案:如果您可以更改 Webstorm 将启动的 Node 可执行文件,您可以尝试制作一个包装 Node 并打印一些调试信息的 shell 脚本。像这样:
#!/bin/sh
echo "ENVIRONMENT: $ENV"
sleep 1
/path/to/actual/node "$@"
这将输出传递给 Node 可执行文件的环境变量。从那里,您可以尝试取消设置任何看起来可疑的变量:
unset STRANGE_VARIABLE
在启动 Node 可执行文件之前,将它们放在上面的脚本中。
关于javascript - 创建 NodeJS + Redis 应用程序导致错误,退出代码为 139,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14116315/