Express自定义模块不在Heroku上载入 [英] Express Custom Module Not Loading on Heroku

查看:160
本文介绍了Express自定义模块不在Heroku上载入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请参阅下面的更新

See Update Below

我已经编写了一个Node.js应用程序,Express可以在本地运行,但是当我运行应用程序Heroku,它给我以下错误:

I have written a Node.js application with Express that works fine locally, but when I run the app on Heroku, it gives me the following error:

2013-01-19T21:55:42+00:00 app[web.1]: module.js:340
2013-01-19T21:55:42+00:00 app[web.1]:     throw err;
2013-01-19T21:55:42+00:00 app[web.1]:     ^
2013-01-19T21:55:42+00:00 app[web.1]: Error: Cannot find module './blog/blog'
2013-01-19T21:55:42+00:00 app[web.1]:     at Function.Module._load (module.js:312:12)
2013-01-19T21:55:42+00:00 app[web.1]:     at Module.require (module.js:362:17)
2013-01-19T21:55:42+00:00 app[web.1]:     at Object.Module._extensions..js (module.js:467:10)
2013-01-19T21:55:42+00:00 app[web.1]:     at require (module.js:378:17)
2013-01-19T21:55:42+00:00 app[web.1]:     at Object.<anonymous> (/app/app.js:15:12)
2013-01-19T21:55:42+00:00 app[web.1]:     at Function.Module._resolveFilename (module.js:338:15)
2013-01-19T21:55:42+00:00 app[web.1]:     at Module.load (module.js:356:32)
2013-01-19T21:55:42+00:00 app[web.1]:     at Module.runMain (module.js:492:10)
2013-01-19T21:55:42+00:00 app[web.1]:     at Function.Module._load (module.js:280:25)
2013-01-19T21:55:42+00:00 app[web.1]:     at Module._compile (module.js:449:26)
2013-01-19T21:55:43+00:00 heroku[web.1]: Process exited with status 1
2013-01-19T21:55:43+00:00 heroku[web.1]: State changed from starting to crashed

我不明白为什么它不工作在Heroku上,因为完全相同的代码在本地完美工作。也许这与我将代码放在Heroku的服务器上有什么关系?以下是我的文件系统,我的 app.js 文件和我的 blog.js 模块的代码我想要 app.js 加载:

I don't understand why it doesn't work on Heroku, because the exact same code works perfectly locally. Maybe it has something to do with how I put the code on Heroku's server? Just in case, below is my filesystem, the code for my app.js file, and my blog.js module that I want app.js to load:

文件系统:

app.js:

//requires and starts up app
var express = require('express');
var app = express();

//db setup
var mongoose = require('mongoose')
  , dbURI = 'localhost/brads-projects';

//configures app for production, connects to MongoHQ databse rather than localhost
app.configure('production', function () {
  dbURI = process.env.MONGOHQ_URL;
});

//requires the various project files
var blog = require('./blog/blog').blog;

//tries to connect to database.
mongoose.connect(dbURI);
//once connection to database is open, then rest of app runs
mongoose.connection.on('open', function () {
  //runs the blog app
  blog(app, express);

  app.listen(process.env.PORT || 5000);
});

//in the event of a connection to database error, the app will not run
mongoose.connection.on('error', console.error.bind(console, 'connection error:'));

blog.js

module.exports.blog = function(app, express) {
    //models
    var postmodel = require('./models/post').postmodel
      , usermodel = require('./models/user').usermodel
      , notificationmodel = require('./models/notification').notificationmodel
      , commentmodel = require('./models/comment').commentmodel;

    //controllers
    var indexHandler = require('./controllers/index').index
      , newpostHandler = require('./controllers/newpost').newpost
      , postandidHandler = require('./controllers/postandid').postandid
      , newPostHandler = require('./controllers/newpost').newpost
      , searchHandler = require('./controllers/search').postsearch
      , loginHandler = require('./controllers/login').login
      , logoutHandler = require('./controllers/login').logout
      , dashboardHandler = require('./controllers/dashboard').dashboard
      , registerHandler = require('./controllers/register').register
      , userSettingsHandler = require('./controllers/usersettings').usersettings
      , editpostHandler = require('./controllers/editpost').editpost
      , newCommentHandler = require('./controllers/newcomment').newcomment;

    //misc requires
    var MemStore = require('connect/lib/middleware/session/memory');

    //configures app for general stuff needed such as bodyParser and static file directory
    app.configure(function () {
        app.use(express.bodyParser());
        app.use(express.static(__dirname + '/static'));
        app.use(express.cookieParser('lockirlornie123'));
        app.use(express.session({store: MemStore( {
            reapInterval: 60000 * 10
        })}));
    });

    //requires a user session for access
    function requiresLogin(request, response, next) {
        if (request.session.user) {
            next();
        } else {
            response.redirect('/blog/login');
        }
    };

    //requires user session and admin for access
    function requiresLoginAndAdmin(request, response, next) {
        if (request.session.user && request.session.user.role === 'admin') {
            next();
        } else {
            if (request.session.user) {
                response.redirect('/blog');
            } else {
                response.redirect('/blog/login');
            }
        }
    };

    console.log("loaded");

    var PostModel = new postmodel();
    var Post = PostModel.setupPostSchema();

    var UserModel = new usermodel();
    var User = UserModel.setupUserSchema();

    var NotificationModel = new notificationmodel();
    var Notification = NotificationModel.setupNotificationSchema();
    NotificationModel.clickNotificationHandler(app, Notification);

    var CommentModel = new commentmodel();
    var Comment = CommentModel.setupCommentSchema();

    app.set('views', __dirname + '/views');
    app.set('view engine','jade');

    /*
    var newuser = new User({email: "brad.ross.35@gmail.com", password: UserModel.createHashPass("Brad1234"), role: 'admin', activated: true});
    newuser.save(function (err) {
        if (err) {
            console.log("error saving!");
        } else {
            console.log("successfully created!");
        }
    });
    */

    //get request for the home page that displays the 10 most recent posts
    indexHandler(app, Post, PostModel, NotificationModel.getNotifications, Notification);

    //get request for the unique page for every post
    postandidHandler(app, Post, NotificationModel.getNotifications, Notification, CommentModel.getComments, Comment);

    //post request for the submit url that creates a new post and puts it into the database
    //if a get request is sent to the sumbit page, it redirects users away from the /submit url in order to keep them away and not cause errors.
    newPostHandler(app, Post, requiresLogin, PostModel, NotificationModel.getNotifications, Notification);

    //post request to create a new comment
    newCommentHandler(app, Comment, requiresLogin, CommentModel, NotificationModel.getNotifications, Notification, NotificationModel.createNotification, Post);

    //get request for search page that both displays search results and allows users to create new search queries
    searchHandler(app, Post, NotificationModel.getNotifications, Notification);

    //login page get request and post request
    loginHandler(app, UserModel.authenticate, User);

    //logout page that redirects back to home
    logoutHandler(app);

    //dashboard page for managing posts by user
    //and if user is an admin, adding and deleting users
    dashboardHandler(app, User, Post, requiresLoginAndAdmin, NotificationModel.getNotifications, Notification, Comment);

    //a page for users to register for posting priveleges
    registerHandler(app, User, UserModel, NotificationModel.createNotification, Notification);

    //a page for user settings
    userSettingsHandler(app, User, UserModel, requiresLogin);

    //a page to edit posts
    editpostHandler(app, Post, requiresLogin, NotificationModel.getNotifications, Notification);
};

更新:

感谢下面的建议,我已经运行 heroku运行bash 来查找实际存在的文件,当我执行以下操作时,我会发现一些有趣的信息,即我正在尝试导入的文件实际上并不存在

Thanks to the suggestions below, I have run heroku run bash to find out what files are actually there, and when I do the following, I find out some intriguing information, namely that the file I am trying to import isn't actually there:

~ $ cd ./blog
~/blog $ ls
~/blog $ cd ..
~ $ cd ./addressbook
~/addressbook $ ls
~/addressbook $ cd ..
~ $ cd ./views
~/views $ ls
addressbook  blog  index
~/views $ cd ./blog
~/views/blog $ ls
dashboard.jade  index.jade    layout.jade  newpost.jade    register.jade
editpost.jade   index_error.jade  login.jade   postandid.jade  search.jade

看起来我正在做的事情不是在app / blog和app / addressbook中上传这些文件。有趣的和好的信息。感谢您的建议...

Looks like something I am doing is not uploading those files in app/blog and app/addressbook. Interesting and a good piece of info. Thanks for the suggestions...

推荐答案

根据您提供的信息,这可能是答案。在mac终端(我假设你正在运行OSX的屏幕快照)从blog.js文件所在的文件夹运行此命令。

Based on the information you have provided this might be the answer. In the mac terminal (i'm assuming from the screenshot you are running OSX) run this command from the folder in which the blog.js file is located.

file blog.js -I

这个应该告诉你这个文件有一个mime类型的'text / plain',如果它返回一个mime类型的'text / x-c',那么它看起来像是最初在Linux上创建的 - 这是你的问题。

This should tell you that the file has a mime type of 'text/plain', if it comes back with a mime type of 'text/x-c' then it looks like the file was originally created on Linux - this is your problem.

只需简单地解决这个问题:

To solve this issue simply:


  • 创建新文件

  • 将blog.js的内容复制到

  • git rm旧文件

  • 重命名新文件

  • 添加新文件

  • create a new file
  • copy the content of blog.js over
  • git rm the old file
  • rename the new file
  • get add the new file

新文件现在应该有text / plain 。将更改推送到Heroku并进行测试。

The new file should now have the mime type of 'text/plain'. Push the changes to Heroku and test.

如果这不是问题,我的下一步将是运行:

If this was not the issue my next step would be to run:

heroku run bash

然后查看文件是否存在你的应用程序期望在Heroku找到它的位置。如果您仍然有问题回覆这些调查结果。

And see if the file exists in the location your app is expecting to find it on Heroku. If you still have issue post back the results of these investigations.

让我知道!

参考: Mac开发人员库:'文件'命令

这篇关于Express自定义模块不在Heroku上载入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆