2013-01-19 14 views
6

See aggiornamento Di seguitoespresso Modulo personalizzata non Caricamento su Heroku

Ho scritto un'applicazione Node.js con Express, che funziona bene a livello locale, ma quando faccio funzionare l'applicazione su Heroku, mi dà il seguente errore:

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 

Non capisco perché non funzioni su Heroku, perché lo stesso codice funziona perfettamente localmente. Forse ha qualcosa a che fare con come ho messo il codice sul server di Heroku? Nel caso in cui, al di sotto è il mio file system, il codice per il mio file app.js, e il mio modulo blog.js che voglio app.js a carico:

filesystem:

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:

Grazie ai suggerimenti di seguito, mi hanno eseguito heroku run bash per scoprire quali file sono in realtà lì, e quando lo faccio quanto segue, ho scoprire qualche informazione interessante, vale a dire che il file che sto cercando di importare non è in realtà c'è:

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

assomiglia a qualcosa che sto facendo non è il caricamento di tali file in app/blog e ap p/rubrica. Interessante e una buona informazione. Grazie per i suggerimenti ...

+0

mi sembra l'applicazione è in esecuzione in una directory di lavoro diverso da quello che ci si aspetta su H eroku. Qual è il valore di 'process.cwd()'? – myanimal

+0

@myanimal Ma fintanto che 'app.js' e' blog.js' si trovano nella stessa directory, dovrebbe funzionare correttamente. –

risposta

4

Sulla base delle informazioni fornite, potrebbe essere la risposta. Nel terminale mac (sto assumendo dallo screenshot che stai usando OSX) esegui questo comando dalla cartella in cui si trova il file blog.js.

file blog.js -I 

Questo dovrebbe dirvi che il file ha un tipo MIME di 'text/plain', se si torna con un tipo MIME di 'text/xc' allora sembra che il file è stato originariamente creato su Linux: questo è il tuo problema.

Per risolvere questo problema semplicemente:

  • creare un nuovo file
  • copiare il contenuto di blog.js sopra
  • git rm il vecchio file
  • rinominare il nuovo file
  • get aggiungi il nuovo file

Il nuovo file ora dovrebbe avere il mime typ e di 'text/plain'. Spingere le modifiche su Heroku e testare.

Se questo non era il problema il mio prossimo passo sarebbe quello di eseguire:

heroku run bash 

e vedere se il file esiste nel percorso vostra applicazione si aspetta di trovare su Heroku. Se hai ancora problemi, pubblica nuovamente i risultati di queste indagini.

Fammi sapere!

Riferimento: Mac developer Library: 'file' command

+1

Avevi ragione! Era un 'text/x-c'. 'git rm blog.js' restituisce' pathspec 'blog/blog.js' non ha trovato alcun file'. Posso spostarlo nel cestino? –

+0

potresti aver bisogno di eseguire 'git rm blog/blog.js' ma si, puoi rimuoverlo nel cestino. l'importante è assicurarsi che i tuoi include siano mime di tipo 'text/plain'. Crea un nuovo file e copia il contenuto di quello vecchio in esso, e poi usa il comando 'file blog.js -I' assicurati che il nuovo file sia di tipo' text/plain', quindi aggiungi e commit quindi premi su Heroku. – webjames

+0

Impossibile capire come creare un file che non sia text/plain. Ogni volta che creo un nuovo file, lo crea sempre come text/x-c. Forse è l'estensione .js? –

1

Strano comportamento; Prova il debug utilizzando:

console.log(__dirname); 

Assicurarsi che il seguente percorso è corretto (punti per i tuoi blog.js file):

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

Quindi provare a passare esplicitamente a require: (potrebbe variare a seconda di ciò che __dirname rendimenti ..)

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

Ecco i log: 'La compilazione di Slug è finita 2013-01-26T01: 13: 01 + 00: 00 heroku [web.1]: processo di avvio con comando' 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]: Errore: impossibile trovare il modulo '/ app/blog/blog' 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' Ancora non funziona, e sembra ok. –

+0

Ok. Ho più informazioni pubblicate sull'aggiornamento del post. Spiacente, questo non è stato risolto fino ad ora! È una specie di pazzo e sono sorpreso che il problema sia così complicato. Ho provato questo e penso che mi dica più informazioni. –

Problemi correlati