如何让 Openshift 使用 Express 4,而不是已安装的 Express 3?

3
我使用Express 4开发了我的Nodejs Express应用程序,并在本地计算机上按预期工作。然后,我将整个应用程序通过git上传到Openshift。当我尝试运行它时,Openshift返回“503 Service Unavailable”。如果我ssh进入我的基本节点cartridge并执行“express -V”,它会返回版本3.2.5。如果我进入我的应用程序文件夹app-root / repo并运行“express -V”,我仍然得到相同的版本3.2.5。
因此,我的Express 4未被包含在git上传中的应用程序的node_modules中使用。如何解决这个问题?有以下几种想法-删除Openshift的Express 3版本,强制Openshift在我的应用程序区域中使用我的Express 4,将Openshift的Express 3升级为Express 4。我无法弄清楚如何做到这些并已经进行了研究。
4个回答

6

以下是故障排除方法:

  • 通过ssh登录到你的cartridge
  • 进入app-root/repo目录
  • 运行grep version ./node_modules/express/package.json
  • 你应该看到一个基于你的package.json依赖的版本号
  • 确认你的package.json文件中包含了一个scripts部分,其中包含一个start命令,并且只使用类似node ./server.js这样的命令来启动你的应用程序(server.js是你编写主应用程序启动脚本的任何文件)。你不需要使用express命令行程序来启动一个express服务器。它只用于设置新项目样板和其他辅助任务。
  • 要查看在你的应用程序中运行的express版本,你可以将此代码添加到你的server.js(或等效)文件中:console.log(require("express/package").version);

我原来用的是 "express": "~4.0.0",但或许这不够强制。我会改成准确的 "express": "=4.9.0",试试看,然后再回来。 - Ric
很遗憾没有任何改变。显然,当Node托架启动时,它会绑定到安装在应用程序项目文件夹外部的Openshift Express版本。它仍然发布3.2.5版本,导致应用程序无法启动。我再次确认应用程序可以在我的本地计算机上正常运行。必须有一种方法可以将Express的Openshift版本更新到最新版,但我并没有找到相关文档或技术讨论。请问有助于这些方面的任何帮助吗? - Ric
根据您的指示,我看到了“version”:“4.12.0”。因此,我的项目是使用Express 4构建的,当在本地运行时,它可以正确运行。但是当我在openshift上运行应用程序时,似乎Node启动了Openshift Express 3而不是使用我的Express 4。是否有一个JavaScript / Express命令可以在运行的应用程序内部运行,以显示活动的Express版本? 我不是指grep package.json,那只告诉我Express 4代码在我的应用程序区域中。我想让正在运行的Express通过其版本号告诉我他是谁。 - Ric
我怀疑安装的Express3实际上没有运行。Express不运行,Node运行。你的代码运行并需要Express,它将使用应用程序node_modules文件夹中的Express。我添加了上面的代码,你可以使用它来确认应用程序中实际运行的版本。 - Peter Lyons
你刚提供的那行代码非常有帮助。你是绝对正确的,Express 3 被忽略了。这个信息解决了这个“问题”。我希望我能以某种方式为你点赞。 - Ric

3

1

请尝试以下操作

rhc ssh
cd app-root/repo
npm start

同时编辑./bin/www文件

var port = normalizePort(process.env.OPENSHIFT_NODEJS_PORT || '8080'); 
var ip = process.env.OPENSHIFT_NODEJS_IP;
        if (typeof ip === "undefined") {
            //  Log errors on OpenShift but continue w/ 127.0.0.1 - this
            //  allows us to run/test the app locally.
            console.warn('No OPENSHIFT_NODEJS_IP var, using 127.0.0.1');
            ip = "127.0.0.1";
        };
//app.set('ip', port);  
app.set('port', port);

var server = http.createServer(app);

server.listen(port, ip);
server.on('error', onError);
server.on('listening', onListening);

1

您可以按照以下步骤进行:

  1. 复制所有内容 bin/www 并替换文件 server.js 中的所有内容:

  2. 更改 server.js 中的一些内容:

`var port = normalizePort(process.env.PORT || '3000');`

to

var port = normalizePort(process.env.OPENSHIFT_NODEJS_PORT || '3000');

添加行:
var ip = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1';

from

server.listen(port);

server.listen(port, ip);
  1. 在 package.json 中添加更多内容

来源

"scripts": {
    "start": "node bin/www"
},

"scripts": {
    "start": "node server.js"
}, 

添加行:

"main": "server.js",
  1. 使用 npm install --save module-name 命令进行 npm install

  2. 创建 .gitignore 文件,内容为:

    node_modules

  3. 在本地运行 node server.js 命令以启动地址为 localhost:3000 的服务器

  4. 上传至 openshift:

    git add . git commit -m "First update new server version" git push

  5. 浏览器访问:domain-appname.rhcloud.com


这就是正确的答案,只需要多走一步: 在bin/www的开头,在var app = require('../app');这一行中,只需删除一个点以便在从根路径执行server.js脚本时正确寻址到app -> var app = require('./app'); - Eagle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接