See aktualisieren untenExpress benutzerdefinierte Module nicht geladen auf Heroku
Ich habe eine Node.js Anwendung mit Express geschrieben, die feinen lokal funktioniert, aber wenn ich die App auf Heroku laufen, es gibt mir die folgende Fehlermeldung:
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
Ich verstehe nicht, warum es nicht auf Heroku funktioniert, weil der exakt gleiche Code perfekt lokal funktioniert. Vielleicht hat es etwas damit zu tun, wie ich den Code auf Herokus Server lege? Nur für den Fall, unten ist mein Dateisystem, der Code für meine app.js
Datei, und mein blog.js
Modul, das ich app.js
laden möchten:
Dateisystem:
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: "[email protected]", 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);
};
UPDATE:
Dank der Vorschläge unten, ich habe heroku run bash
laufen, um herauszufinden, welche Dateien tatsächlich gibt es, und wenn ich den folgenden Code, finde ich einige interessante Informationen, nämlich dass die Datei, die ich zu importieren versuche nicht wirklich dort:
~ $ 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
Sieht aus wie etwas, das ich nicht die Dateien in app/Blog und ap Hochladen tue p/Adressbuch. Interessant und ein gutes Stück Info. Danke für die Vorschläge ...
Es scheint mir, die App in einem anderen Arbeitsverzeichnis ausgeführt wird, als Sie auf H erwarten eroku. Was ist der Wert von 'process.cwd()'? – myanimal
@myanimal Aber solange 'app.js' und' blog.js' im selben Verzeichnis sind, sollte es gut funktionieren. –