应用程序无法启动(端口8080)不可用

时间:2015-07-20 08:18:24

标签: node.js mongodb openshift

我正在尝试将我的node.js应用程序(使用express和mongoose)部署到openshift,但我无法这样做。该应用程序在我的本地环境中完美运行。

我的入口点是文件/ bin / www

我将此作为openshift的入口点,在package.json文件中使用此行(每this thread):

"main": "bin/www",

我确保根据指南使用环境变量设置我的mongodb连接,如下所示:

// default to a localhost configuration:
var mongoConnectionString = 'mongodb://127.0.0.1/code-blog';

// if OPENSHIFT env variables are present, use the available connection info:
if (process.env.OPENSHIFT_MONGODB_DB_PASSWORD) {
  mongoConnectionString = process.env.OPENSHIFT_MONGODB_DB_USERNAME + ":" +
  process.env.OPENSHIFT_MONGODB_DB_PASSWORD + "@" +
  process.env.OPENSHIFT_MONGODB_DB_HOST + ':' +
  process.env.OPENSHIFT_MONGODB_DB_PORT + '/' +
  process.env.OPENSHIFT_APP_NAME;
}

mongoose.connect(mongoConnectionString);

我得到的错误是:

remote: Waiting for application port (8080) become available ...
remote: Application 'codeblog' failed to start (port 8080 not available)
remote: -------------------------
remote: Git Post-Receive Result: failure
remote: Activation status: failure
remote: Activation failed for the following gears:
remote: 558a25bd5973ca7a74000162 (Error activating gear: CLIENT_ERROR: Failed to
 execute: 'control start' for /var/lib/openshift/558a25bd5973ca7a74000162/nodejs

remote: #<IO:0x00000000b49380>
remote: #<IO:0x00000000b49308>
remote: )
remote: Deployment completed with status: failure
remote: postreceive failed
To ssh://558a25bd5973ca7a74000162@codeblog-donaldsubert.rhcloud.com/~/git/codebl
og.git/
   29635a8..7a0e926  master -> master

这是我的意思,因为我没有在任何地方指定端口8080。实际上,默认端口在此处指定:

var port = normalizePort(process.env.OPENSHIFT_NODEJS_PORT || "3000");
var server_ip_address = process.env.OPENSHIFT_NODEJS_IP || "127.0.0.1";

app.set('port', port);

var server = http.createServer(app);

我不确定从哪里开始。我似乎没有足够的信息来确定我的下一步。

[编辑] 我添加了一些日志记录来测试它运行的端口,但是日志记录语句永远不会运行。这是代码

console.log("TEST TEST TEST");

var app = require('../app');
var debug = require('debug')('ProjectTemplate:server');
var http = require('http');

var port = normalizePort(process.env.OPENSHIFT_NODEJS_PORT || "3000");
var server_ip_address = process.env.OPENSHIFT_NODEJS_IP || "127.0.0.1";

console.log("PORT: ", port);

和输出

TEST TEST TEST
module.js:340
    throw err;
    ^
Error: Cannot find module './routes/logIn'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/var/lib/openshift/558a25bd5973ca7a74000162/app-root/           runtime/repo/app.js:26:13)

TEST TEST TEST来自入口点文件开头的日志记录语句。在它遇到console.log("PORT: ", port);之前似乎有些事情失败了很可能这与进行MongoDb连接的app.js有关。

[/编辑]

6 个答案:

答案 0 :(得分:10)

有完全相同的错误消息:Application 'appname' failed to start (port 8080 not available) on open shift node app

经过大量阅读后发现许多不同的用户针对相同的错误信息找到了不同的解决方案,包括我自己。因此,我建议不要为此错误寻找快速解决方案。 最重要的步骤是以下列表中的第1步。

我的解决方案是在package.json中添加一个缺少的依赖项,对于我的特殊情况,我需要添加"bcrypt":"~0.8.5",这是一个愚蠢的事情!

现在,我是如何解决问题的,只知道&#34;端口8080不可用&#34;错误:

  1. ssh&#39; d进入应用程序,转到app repo目录(cd $OPENSHIFT_REPO_DIR)并运行npm start
  2. 得到[...] Error: Cannot find module 'bcrypt' [...]
  3. 从ssh退出,运行npm info bcrypt | grep "version:",它返回&#34; 0.8.5&#34;
  4. 添加了条目&#34; bcrypt&#34;:&#34; ~0.8.5&#34;到我的package.json和提交/推送更改。
  5. 问题解决了,app运行!

答案 1 :(得分:10)

错误结果是与端口无关的一般错误。显然,如果有任何致命的javascript错误,它会给出此消息。

答案 2 :(得分:5)

我在这里详细提到了...... Application 'appname' failed to start (port 8080 not available) on open shift node app

解决方案是您需要在侦听服务器时指定IP地址。

这就是我修复它的方法。

var express = require('express');
var app = express();
var http = require('http');

app.set('port', process.env.OPENSHIFT_NODEJS_PORT || process.env.PORT || 3002);
app.set('ip', process.env.OPENSHIFT_NODEJS_IP || "127.0.0.1");


http.createServer(app).listen(app.get('port') ,app.get('ip'), function () {
    console.log("✔ Express server listening at %s:%d ", app.get('ip'),app.get('port'));
    server();
});

答案 3 :(得分:1)

我认为这一行不会在指定端口上创建服务器

var server = http.createServer(app);

你需要告诉它听这样的端口:

server.listen(port);

答案 4 :(得分:1)

当您的应用正在侦听正确的端口时,缺少的是您没有指定要侦听的IP地址。在app.set('port',port)下面添加如下内容;

app.set('ipaddr', server_ip_address);

答案 5 :(得分:0)

对我来说这是连接字符串。创建mongodb盒式磁带后立即建议的那个不起作用:Connection URL: mongodb://$OPENSHIFT_MONGODB_DB_HOST:$OPENSHIFT_MONGODB_DB_PORT/'nodejs'

但是从article开始,使用OPENSHIFT_MONGODB_DB_URL变量就可以了。

if(process.env.OPENSHIFT_MONGODB_DB_URL){
  mongodb_connection_string = process.env.OPENSHIFT_MONGODB_DB_URL + db_name;

}