快速自定义模块不加载在Heroku上

请参阅以下更新

我用Express写了一个Node.js应用程序,在本地工作正常,但是当我在Heroku上运行应用程序时,它给了我以下错误:

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 

我不明白为什么它不能在Heroku上工作,因为完全相同的代码在本地完美工作。 也许这跟我把代码放在Heroku的服务器上有什么关系? 为了以防万一,下面是我的文件系统,我的app.js文件的代码和我想要app.js加载的blog.js模块:

文件系统:

文件系统

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: "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); }; 

更新:

感谢下面的build议,我已经运行了heroku run bash来找出哪些文件实际存在,当我做了以下,我发现了一些有趣的信息,即我试图导入的文件实际上并不存在

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

看起来我正在做的是不在app / blog和app / addressbook中上传这些文件。 有趣的和一个很好的信息。 感谢您的build议…

根据您提供的信息,这可能是答案。 在macterminal(我从截图中假设你正在运行OSX)从blog.js文件所在的文件夹运行此命令。

 file blog.js -I 

应该告诉你这个文件有一个MIMEtypes的“text / plain”,如果它带有一个MIMEtypes的“text / xc”,那么它看起来像是最初在Linux上创build的文件 – 这是你的问题。

简单地解决这个问题:

  • 创build一个新的文件
  • 复制blog.js的内容
  • git rm旧文件
  • 重命名新文件
  • 得到添加新的文件

现在新文件应该有mimetypes的“text / plain”。 将更改推送到Heroku并testing。

如果这不是问题,我的下一步就是运行:

 heroku run bash 

并查看该文件是否存在于您的应用程序希望在Heroku上find的位置。 如果您仍有问题,请回传这些调查的结果。

让我知道!

参考: Mac开发者图书馆:'文件'命令

奇怪的行为; 尝试debugging使用

 console.log( __dirname ); 

确保以下path正确(指向您的blog.js文件):

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

然后尝试显式传递它以require :(可能取决于什么__dirname返回..)

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