【问题标题】:Run NodeJS app on nodejitsu, all i get is "cannot get /"在 nodejitsu 上运行 NodeJS 应用程序,我得到的只是“无法获取 /”
【发布时间】:2014-10-16 22:05:38
【问题描述】:

作为我学习的一部分,我想将我的应用程序部署到 nodejitsu。它在我的本地服务器上运行良好,但在 nodejitsu 上我得到的只是

Cannot GET /

我认为这可能与服务器上的 NODE_ENV 设置为生产有关,但我从未在本地服务器上接触过这个。我在 nodejitsu 上将它更改为开发,但我仍然无法让它工作。

在注释完所有代码后,我认为问题出在我的 index.js 中,如下所示:

var express = require('express');//the framework
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
//var session = require('express-session');
var methodOverride = require('method-override');
var passport = require("passport");//for authentication
var LocalStrategy = require('passport-local').Strategy;//local users for passport
var http = require('http');
var path = require('path');
var db = require('./dataBase');//to connect to the db
var userRoles = require('./routingConfig').userRoles;
var accessLevels = require('./routingConfig').accessLevels;

var debug = false;

var db = new db('inmobiliaria', 'localhost', 3306, debug);

require('./passport')(passport, db, debug)
var app = express();

app.set('port', 1337);
app.use(methodOverride());
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }))
//app.use(session({ secret: 'SECRET' }));
app.use(passport.initialize());
app.use(passport.session());

app.use(function (req, res, next) {
    var role = userRoles.public;//default role
    var username = '';

    if (req.user) {
        role = req.user.role;
        username = req.user.username;
    }
    res.cookie('user', JSON.stringify({
        'username': username,
        'role': role
    }));

    next();
});

app.use('/', express.static(path.join(__dirname + '/../Client/')));
app.use("/lib", express.static(path.join(__dirname + '/../Client/lib/')));
app.use("/ctr", express.static(path.join(__dirname + '/../Client/Controllers/')));
app.use("/media", express.static(path.join(__dirname + '/../Client/media/')));
app.use("/views", express.static(path.join(__dirname + '/../Client/Views/')));
app.use("/srv", express.static(path.join(__dirname + '/../Client/Services/')));
app.use("/dct", express.static(path.join(__dirname + '/../Client/Directives/')));

require('./routes')(app, passport, db);
//require('./emailConfiguration');

http.createServer(app).listen(process.env.PORT || app.get('port'), function (err) {
    console.log("Express server listening on port " + app.get('port'));
    if (err) {
        throw err; // For completeness's sake.
    }
});

我调查了这个变量,但我不确定它是否与它有关。这是网址http://horaciotest.jit.su/,如果您想查看的话。 是这个配置吗?我在做不该做的事吗?

感谢您抽出宝贵时间。

编辑:

我设法将错误情况减少到我认为的几行。正如 nodejitsu 的人所建议的那样,我现在尝试使用模块 node-static 来提供静态文件,但我无法让它与 express 一起工作:

此代码适用于 nodejitsu 和我的本地服务器(或至少不显示任何错误)

var statik = require('node-static');
var http = require('http');
var path = require('path');

var file = new (statik.Server)(path.join(__dirname + '/../Client/'));//index.html here
http.createServer(function (req, res) {
    console.log(path.join(__dirname + '/../Client/'));
    file.serve(req, res);
}).listen(8080);

但是一旦我添加快递,我就会收到上面提到的错误:

var express = require('express');    
var statik = require('node-static');
var http = require('http');
var path = require('path');

var app = express();

var file = new (statik.Server)(path.join(__dirname + '/../Client/'));//index.html here
http.createServer(app, function (req, res) {
    console.log(path.join(__dirname + '/../Client/'));
    file.serve(req, res);
}).listen(8080);

谁能告诉我为什么当我添加快递应用程序时出现错误?这可能是我需要让它在 nodejitsu 上工作,谢谢!

【问题讨论】:

  • 请注意,使用app.use() 指定路径是前缀,而不是路由。 app.use('/', ...) 映射到每个请求、每个路径、每个方法。而且,static() 中间件是递归的,将提供子目录中的文件。
  • __dirname + '/../Client/' 中是否有index.html 或类似的“默认”页面,或者./routes 是否指定了app.get('/', ...) 路由处理程序?
  • 感谢您的回答,我是 node 和 javascript 的新手,我会尝试回答:'/../Client/' 中有一个 index.html,而 ./routes 中只有我调用的所有方法得到一个json响应。 app.use('/') 用于为 index.html 提供服务,它反过来加载我使用的 angularjs 代码,所有路由都在客户端完成。你是在建议我应该改变我这样做的方式吗?

标签: node.js express static nodejitsu node-static


【解决方案1】:

我发现了问题所在,希望对某人有所帮助:

我的项目结构有两个文件夹:一个名为 Client,我的所有 html 和 .js 都来自 angular where。 另一个文件夹是 WebServer,我有我所有的 nodejs 文件。

为了部署到 nodejitsu,您运行一个命令 jitsu deploy,这又运行另一个命令:npm pack。此命令创建一个 .tgz 文件,其中包含 nodejs 目录中的所有数据,不包括 node_modules 文件和任何以 . 开头的文件。问题是,如果您像我一样在该文件夹之外有文件,它们将不会被包含在内。

解决方案是将您的客户端文件夹移动到 nodejs 中。您需要发送到服务器的所有内容都应该在此文件夹中。

【讨论】:

    猜你喜欢
    • 2012-11-27
    • 2021-08-03
    • 1970-01-01
    • 2019-03-19
    • 2016-07-13
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多