Note that there are some explanatory texts on larger screens.

plurals
  1. POExpress Custom Module Not Loading on Heroku
    primarykey
    data
    text
    <p><em>See Update Below</em></p> <p>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:</p> <pre><code>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.&lt;anonymous&gt; (/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 </code></pre> <p>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 <code>app.js</code> file, and my <code>blog.js</code> module that I want <code>app.js</code> to load:</p> <p><strong>filesystem:</strong></p> <p><img src="https://i.stack.imgur.com/Q5RRX.png" alt="filesystem"></p> <p><strong>app.js:</strong></p> <pre><code>//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:')); </code></pre> <p><strong>blog.js:</strong></p> <pre><code>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 &amp;&amp; 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); }; </code></pre> <p><strong>UPDATE:</strong></p> <p>Thanks to the suggestions below, I have run <code>heroku run bash</code> 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 <em>isn't actually there</em>:</p> <pre><code>~ $ 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 </code></pre> <p>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...</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload