【问题标题】:Node.js modules not accessible after ssh connection closedssh 连接关闭后无法访问 Node.js 模块
【发布时间】:2015-01-09 06:17:15
【问题描述】:

我已经使用 Express 和 MongoDB 在 Node.js 中编写了我的第一个 web 应用程序。作为基础,我使用了this example

在本地测试服务器时一切都运行顺利,并且最初在服务器上运行时也是如此(这是我通过 SSH 连接并使用PM2 在断开连接后保持进程运行的 Ubuntu 服务器)。我遇到的问题是,当与服务器断开连接时,起初像魅力一样工作的网页会在我脸上抛出错误(请参阅下面的错误消息)。

Error: Failed to lookup view "index"
  at Function.app.render (/home/ubuntuserver/appname/node_modules/express/lib/application.js:489:17)
  at ServerResponse.res.render (/home/ubuntuserver/appname/node_modules/express/lib/response.js:755:7)
  at exports.index (/home/ubuntuserver/appname/routes/basic.js:4:7)
  at callbacks (/home/ubuntuserver/appname/node_modules/express/lib/router/index.js:161:37)
  at param (/home/ubuntuserver/appname/node_modules/express/lib/router/index.js:135:11)
  at pass (/home/ubuntuserver/appname/node_modules/express/lib/router/index.js:142:5)
  at Router._dispatch (/home/ubuntuserver/appname/node_modules/express/lib/router/index.js:170:5)
  at Object.router (/home/ubuntuserver/appname/node_modules/express/lib/router/index.js:33:10)
  at Context.next (/home/ubuntuserver/appname/node_modules/express/node_modules/connect/lib/proto.js:190:15)
  at Context.actions.pass (/home/ubuntuserver/appname/node_modules/passport/lib/passport/context/http/actions.js:77:8)
  at SessionStrategy.authenticate (/home/ubuntuserver/appname/node_modules/passport/lib/passport/strategies/session.js:67:10)
  at attempt (/home/ubuntuserver/appname/node_modules/passport/lib/passport/middleware/authenticate.js:243:16)
  at Passport.authenticate (/home/ubuntuserver/appname/node_modules/passport/lib/passport/middleware/authenticate.js:244:7)
  at next (/home/ubuntuserver/appname/node_modules/express/node_modules/connect/lib/proto.js:190:15)
  at Passport.initialize (/home/ubuntuserver/appname/node_modules/passport/lib/passport/middleware/initialize.js:69:5)
  at next (/home/ubuntuserver/appname/node_modules/express/node_modules/connect/lib/proto.js:190:15)
  at next (/home/ubuntuserver/appname/node_modules/express/node_modules/connect/lib/middleware/session.js:313:9)
  at /home/ubuntuserver/appname/node_modules/express/node_modules/connect/lib/middleware/session.js:330:9
  at /home/ubuntuserver/appname/node_modules/express/node_modules/connect/lib/middleware/session/memory.js:55:7
  at process._tickCallback (node.js:415:13)

节点进程似乎一直在运行,但是在断开 SSH 连接时出现问题。通过 SSH 重新连接时,一切都直接开始照常工作。

有什么想法吗?

编辑: 通过意识到 PM2 的集群模式不适用于 Passport 中使用的会话,我设法减少了一些错误。我现在使用 -x 启动 PM2,并在断开 SSH 并尝试重新加载页面时在浏览器中收到以下错误:

Error: Failed to lookup view "index"
    at Function.app.render (/home/ubuntuserver/appname/node_modules/express/lib/application.js:489:17)
    at ServerResponse.res.render (/home/ubuntuserver/appname/node_modules/express/lib/response.js:755:7)
    at exports.index (/home/ubuntuserver/appname/routes/basic.js:4:7)
    at callbacks (/home/ubuntuserver/appname/node_modules/express/lib/router/index.js:161:37)
    at param (/home/ubuntuserver/appname/node_modules/express/lib/router/index.js:135:11)
    at pass (/home/ubuntuserver/appname/node_modules/express/lib/router/index.js:142:5)
    at Router._dispatch (/home/ubuntuserver/appname/node_modules/express/lib/router/index.js:170:5)
    at Object.router (/home/ubuntuserver/appname/node_modules/express/lib/router/index.js:33:10)
    at Context.next (/home/ubuntuserver/appname/node_modules/express/node_modules/connect/lib/proto.js:190:15)
    at Context.actions.pass (/home/ubuntuserver/appname/node_modules/passport/lib/passport/context/http/actions.js:77:8)

【问题讨论】:

  • 请发布此文件中的代码:/home/ubuntuserver/appname/routes/basic.js:4:7。这是结合了您的快速设置app.set('views', thisPathIsVeryImportant) 的基本文件系统布局。因此,我们需要查看您存储视图文件的文件系统结构以及您如何配置 express 以及您对res.render 的调用。
  • 好的。我的 basic.js 基本上只是 var mongoose = require('mongoose'); exports.index = function(req, res) { res.render('index', { user: req.user }); }; 我注意到 express 使用 this.set('views', process.cwd() + '/views'); 在其 application.js 文件中设置视图文件夹的位置。当通过 SSH 和记录 process.cwd() 连接时,我得到:/home/ubuntuserver/,但在断开 SSH 连接时,我得到(unreachable)。我尝试从 process.cwd() 更改为实际位置,但同样的问题仍然存在。似乎没有使用 Express 的 application.js 中设置的“视图”。

标签: node.js express ssh passport.js


【解决方案1】:

我认为您需要在您的应用程序中明确指定 app.set('views', __dirname + '/views') 以避免使用 process.cwd() 的快速默认值。 PM2 更改进程的当前工作目录或一些奇怪的事情可能会发生一些奇怪的事情。这可能与您的代码无关,而与您的服务器环境有关,因此很难远程排除故障。您可以尝试使用 upstart 而不是 PM2。

【讨论】:

  • 我想我在做点什么。我在我的应用程序中尝试了硬编码app.set('views', '/home/<user>/<appname>/views');。使用 Forever 和 PM2 运行它时,一切正常,直到我断开 SSH,然后找不到视图,然后当我再次重新连接时,一切又开始工作了。当我断开 SSH 连接时,似乎可能无法访问 /home/...。我应该将我的应用程序放在服务器的哪个位置,以便始终可以访问它?
  • 在将应用程序置于根目录 (/) 中,然后使用 sudo 启动 Forever 或 PM2 进程时,我已经设法让一切正常。我知道这肯定不是理想的。正如您可能注意到的那样,我不喜欢设置服务器,所以有什么想法可以代替吗?
猜你喜欢
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 2017-03-01
  • 2011-05-09
  • 2014-06-14
  • 2021-03-16
  • 2014-01-25
相关资源
最近更新 更多