2013-01-19 12 views
6

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:

filesystem

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 ...

+0

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

+0

@myanimal Aber solange 'app.js' und' blog.js' im selben Verzeichnis sind, sollte es gut funktionieren. –

Antwort

4

Basierend auf den Informationen, die Sie zur Verfügung gestellt haben, könnte dies die Antwort sein. Im Mac-Terminal (ich gehe davon aus, dass Sie OSX ausführen), führen Sie diesen Befehl aus dem Ordner aus, in dem sich die Datei blog.js befindet. Diese

file blog.js -I 

sollte Ihnen sagen, dass die Datei einen MIME-Typ ‚text/plain‘ hat, wenn es mit einem MIME-Typ ‚text/xc‘ kommt zurück, dann sieht es aus wie die Datei ursprünglich erstellt wurde unter Linux - das ist dein Problem.

um dieses Problem zu lösen einfach:

  • erstellen Sie eine neue Datei
  • kopieren Sie den Inhalt von blog.js über
  • git rm die alte Datei
  • die neue Datei
  • umbenennen get füge die neue Datei hinzu

Die neue Datei sollte nun den Mime-Typ haben e von 'text/plain'. Drücke die Änderungen an Heroku und teste.

Wenn dies nicht das Problem Schritt meines nächster war wäre zu laufen:

heroku run bash 

Und sehen, ob die Datei in der Lage besteht Ihre App erwartet wird auf Heroku zu finden. Wenn Sie noch Fragen haben, schreiben Sie die Ergebnisse dieser Untersuchungen zurück.

Lassen Sie mich wissen!

Referenz: Mac developer Library: 'file' command

+1

Sie hatten Recht! Es war ein 'text/x-c'. 'git rm blog.js gibt 'pathspec' zurück blog/blog.js 'hat keine Dateien gefunden.' Kann ich es einfach in den Papierkorb verschieben? –

+0

Sie müssen möglicherweise 'git rm blog/blog.js' ausführen, aber ja, Sie könnten es in den Papierkorb entfernen. Es ist wichtig sicherzustellen, dass es sich bei Ihren Includes um Mime-Typen 'text/plain' handelt. Erstellen Sie eine neue Datei und kopieren Sie den Inhalt des alten darin und stellen Sie dann mit dem Befehl 'file blog.js -I' sicher, dass die neue Datei den Typ' text/plain' hat, fügen Sie dann commit hinzu und drücken Sie dann auf Heroku. – webjames

+0

Kann nicht herausfinden, wie man eine Datei erstellt, die nicht text/plain ist. Wenn ich eine neue Datei erstelle, wird sie immer als text/x-c erstellt. Vielleicht ist es die Erweiterung .js? –

1

Seltsames Verhalten; Versuchen Sie das Debuggen mit:

console.log(__dirname); 

Vergewissern Sie sich, dass der folgende Pfad korrekt (zeigt auf Ihre blog.js-Datei) ist:

console.log(__dirname + '/blog/blog.js'); 

Dann versuchen Sie es explizit zu übergeben require: (kann variieren je nachdem, welche __dirname zurückkehrt ..)

var blog = require(__dirname + '/blog/blog').blog; 
+0

Hier sind die Logs: 'Slug Compilation fertig 2013-01-26T01: 13: 01 + 00: 00 heroku [web.1]: Startvorgang mit dem Befehl' node app.js' 2013-01-26T01: 13: 05 + 00: 00 app [web.1]: 2013-01-26T01: 13: 05 + 00: 00 app [web.1]: dirname + /blog/blog.js: /app/blog/blog.js 2013-01-26T01: 13: 05 + 00: 00 App [web.1]: Fehler: Modul '/ app/blog/blog' konnte nicht gefunden werden 2013-01-26T01: 13: 05 + 00: 00 app [ web.1]: module.js: 340 2013-01-26T01: 13: 05 + 00: 00 app [web.1]: dirname:/app' Funktioniert immer noch nicht, und es scheint in Ordnung zu sein. –

+0

Ok. Ich habe weitere Informationen zum Update des Beitrags gepostet. Entschuldigung, das wurde bis jetzt nicht gelöst! Es ist irgendwie verrückt, und ich bin überrascht, dass das Problem so kompliziert ist. Habe es ausprobiert und ich denke, es sagt mir mehr Infos. –

Verwandte Themen