2013-01-19 9 views
6

Zobacz Aktualizacja Poniżejekspresowe Niestandardowy moduł nie Załadunek na Heroku

Pisałem aplikacja node.js z Express, który działa prawidłowo lokalnie, ale kiedy uruchomić aplikację na Heroku, to daje mi następujący błąd:

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 

Nie rozumiem, dlaczego nie działa na Heroku, ponieważ dokładnie ten sam kod działa idealnie lokalnie. Może ma to coś wspólnego z tym, jak umieszczam kod na serwerze Heroku? Tylko w przypadku, poniżej jest mój system plików, kod dla mojego pliku app.js, a mój moduł blog.js że chcę app.js do obciążenia:

systemu plików:

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:

Dzięki poniższych sugestii, mam uruchomić heroku run bash aby dowiedzieć się, jakie pliki są faktycznie istnieje, a kiedy należy wykonać następujące czynności, dowiem się pewne intrygujące informacje, a mianowicie, że plik próbuję zaimportować nie jest faktycznie tam:

~ $ 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 

wygląda jak coś robię nie jest przesłać te pliki w app/blog i AP p/książka adresowa. Interesujące i dobre informacje. Dzięki za sugestie ...

+0

wydaje mi się, że aplikacja jest uruchomiona w innym katalogu roboczym niż można się spodziewać na H eroku. Jaka jest wartość 'process.cwd()'? – myanimal

+0

@myanimal Ale tak długo, jak 'app.js' i' blog.js' są w tym samym katalogu, powinno działać poprawnie. –

Odpowiedz

4

Na podstawie podanych informacji może to być odpowiedź. W terminalu mac (zakładam, że na zrzucie ekranu działa OSX) uruchom to polecenie z folderu, w którym znajduje się plik blog.js.

file blog.js -I 

Ten powinny powiedzieć, że plik ma typ MIME „text/plain”, jeśli chodzi o powrót z typem MIME „text/xc” to wygląda plik został pierwotnie stworzony w systemie Linux - to jest twój problem.

Aby rozwiązać ten problem prościej:

  • utworzyć nowy plik
  • skopiować zawartość blog.js nad
  • git rm stary plik
  • zmienić nazwę nowego pliku
  • get dodaj nowy plik

Nowy plik powinien teraz mieć typ mime e "tekst/zwykły". Przekaż zmiany do Heroku i sprawdź.

Jeśli to nie była kwestia moim następnym krokiem byłoby uruchomić:

heroku run bash 

i sprawdzić, czy plik istnieje w miejscu aplikacja spodziewa się go znaleźć na Heroku. Jeśli nadal masz problem, odeślij wyniki tych dochodzeń.

Daj mi znać!

referencyjny: Mac developer Library: 'file' command

+1

Miałeś rację! Był to "text/x-c". 'git rm blog.js' zwraca' pathspec 'blog/blog.js' nie pasuje do żadnego pliku'. Czy mogę po prostu przenieść go do kosza? –

+0

konieczne może być uruchomienie 'git rm blog/blog.js', ale tak, możesz usunąć go do kosza. ważne jest, aby twoje załączniki były typu mime "text/plain". Utwórz nowy plik i skopiuj zawartość starego do niego, a następnie za pomocą polecenia 'plik blog.js -I' upewnij się, że nowy plik jest typu' text/plain', a następnie dodaj i zatwierdz, a następnie naciśnij do Heroku. – webjames

+0

Nie mogę określić, jak utworzyć plik, który nie jest tekstem/zwykły. Ilekroć tworzę nowy plik, zawsze tworzy go jako text/x-c. Może to rozszerzenie .js? –

1

Dziwne zachowanie; Spróbuj debugowania przy użyciu:

console.log(__dirname); 

Upewnij się, że następująca ścieżka jest prawidłowa (punkty do blog.js pliku):

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

Następnie spróbuj jawnie przekazać go do require (może się różnić w zależności od tego, co __dirname zwrotów ..)

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

Oto kłody: 'Slug kompilacja zakończyła 2013-01-26T01: 13: 01 + 00: 00 Heroku [web.1]: proces Począwszy polecenia' węzeł app.js' 2013-01-26T01: 13: 05 + 00: 00 ok [web.1] 2013-01-26T01: 13: 05 + 00: 00 ok [web.1] dirname + /blog/blog.js: /app/blog/blog.js 2013-01-26T01: 13: 05 + 00: 00 app [web.1]: błąd: nie można odnaleźć modułu '/ app/blog/blog' 2013-01-26T01: 13: 05 + 00: 00 [aplikację web.1]: module.js: 340 2013-01-26T01: 13: 05 + 00: 00 app [web.1]: dirname:/app' Nadal nie działa i wygląda na to, że jest OK. –

+0

Ok. Mam więcej informacji na temat aktualizacji postu. Przepraszamy, to nie zostało rozwiązane do tej pory! To trochę szalone i jestem zaskoczony, że problem jest tak skomplikowany. Wypróbowałem to i myślę, że mówi mi więcej informacji. –

Powiązane problemy