亚马逊弹性 Beanstalk npm 找不到 package.json 文件

24

我对亚马逊网络服务非常陌生,现在正在尝试在他们的弹性 Beanstalk 上设置一个 node.js 应用程序。我已经设置了实例并上传/部署了网站,但是虽然健康状态显示为“Ok”,但 node.js 日志重复显示了大约 30 次以下内容:

npm ERR! enoent ENOENT: no such file or directory, open '/var/app/current/package.json'
npm ERR! enoent This is most likely not a problem with npm itself
npm ERR! enoent and is related to npm not being able to find a file.
npm ERR! enoent 

npm ERR! Please include the following file with any support request:
npm ERR!     /var/app/current/npm-debug.log
npm ERR! Linux 4.1.13-19.31.amzn1.x86_64
npm ERR! argv "/opt/elasticbeanstalk/node-install/node-v4.2.3-linux-x64/bin/node" "/opt/elasticbeanstalk/node-install/node-v4.2.3-linux-x64/bin/npm" "start"
npm ERR! node v4.2.3
npm ERR! npm  v2.14.7
npm ERR! path /var/app/current/package.json
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall open

问题在于我的 package.json 是存在的,因为我用 npm init 生成了一个。有任何想法为什么它找不到?这里是 package.json 文件。

{
    "name": "testwebsite",
    "version": "0.0.1",
    "scripts": {
        "start": "node server.js"
    },
    "dependencies": {
        "body-parser": "^1.13.3",
        "express": "^4.13.3",
        "express-session": "~1.0.0",
        "socket.io": "^1.3.7"
    },
    "description": "my website",
    "author": "Matt",
    "engines": {
        "node": ">=0.10.0"
    },
    "main": "server.js",
    "devDependencies": {},
    "license": "ISC"
}

3
你最后解决了这个问题吗?我也遇到了同样的问题。 - Nitzan Wilnai
5个回答

49

根据AWS官方论坛上的一篇帖子[1],你可能会将顶级目录压缩而不是压缩源本身,这也是我的问题所在。

例如,您可能有一个名为“Project”的文件夹,您应该压缩并上传“Project”的内容,而不是压缩"Project"文件夹本身。

[1] https://forums.aws.amazon.com/thread.jspa?messageID=476022


1
一开始我对此不以为意,但后来意识到我做错了! - aero
AWS的明确操作步骤可以在这里找到:https://aws.amazon.com/blogs/devops/creating-deployable-app-archives-for-elastic-beanstalk/我特别欣赏git archive --format=zip HEAD > myapp.zip这个命令。 - jgrumps

3

我曾经遇到过与这个问题相同或非常相似的问题,它是由于我的代码监听了一个自定义端口,而不是Elastic Beanstalk设置为环境变量的端口(8081)。

我在创建express应用程序后的app.jsserver.js文件中的顶部附近修复了这个设置。例如:

var app = express();
app.set('port', (process.env.PORT || 5000)); // 5000 was my original port

然后在app.listen方法中使用该端口而不是我自己的自定义端口号:

app.listen(app.get('port'), function () {
    console.log('Server has started! http://localhost:' + app.get('port') + '/');
});

在这里查看更多细节:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs.container.html#nodejs-platform-proxy,该链接涉及IT技术。

哇!谢谢! - aero
1
谢谢,这对于在AWS Elastic Beanstalk上托管LoopbackJS也很有帮助。在这里,我不得不去更改config.json到端口8081。使用单独的配置文件重载可以更好地管理不同的端口。 https://loopback.io/doc/en/lb3/Environment-specific-configuration.html如果没有这个更改,它会抛出502 Bad Gateway错误,因为默认端口设置为3000。 - Swaroop

1

我也在AWS EB上遇到了一些奇怪的错误。通常我使用CLI进行部署。

有几件事可以尝试。

  1. 确保package.json不在.gitignore文件中,以确保它被提交到您的存储库中。EB使用git提交历史记录来决定要打包和发送什么。如果没有包含在内,它就不在AWS服务器上

  2. 我使用t2.nano实例(512MB空间)选项用于EC,这似乎是一个问题,因为我的package.json中有很多模块。不确定这是否是我困扰的根本问题,但当我升级到至少具有1GB空间的实例时,我的错误消息发生了变化。

希望这可以帮助你


0

我在压缩等方面遇到了麻烦。我建议使用CodePipeline并将其链接到您的github或AWS codecommit。然后,跳过构建阶段,在部署阶段点击弹性Beanstalk。

您需要暂停该过程并打开一个新标签页,转到EB并创建一个新环境。确保在此示例中单击nodeJS。确保选择“示例代码”,以便AWS可以使用其模板设置它。一旦EB完成构建,您应该有一个可用的模板链接。

然后,您可以返回到CodePipeline选项卡,单击Elastic Beanstalk进行部署,您应该找到刚刚创建的EB。

我推荐这个过程,因为它会自动更新每次您进行git更改。这比压缩文件等更好。


0
我遇到了类似的问题,当使用eb cli时,弹性Beanstalk部署失败。我意识到弹性Beanstalk配置文件不小心被添加到我的.gitignore文件中,导致部署失败。

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