6

以下の更新を参照してください

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、そして私がロードしblog.jsたい私のモジュールです:app.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);
};

アップデート:

以下の提案のおかげで、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にそれらのファイルをアップロードしていないようです。興味深く、良い情報です。提案をありがとう...

4

2 に答える 2

5

あなたが提供した情報に基づいて、これが答えかもしれません。Mac ターミナル (スクリーンショットから OSX を実行していると想定しています) で、blog.js ファイルがあるフォルダーからこのコマンドを実行します。

file blog.js -I

これ、ファイルの MIME タイプが 'text/plain' であることを示しています。MIME タイプが 'text/xc' である場合は、ファイルが最初に Linux で作成されたように見えます。これが問題です。

この問題を簡単に解決するには:

  • 新しいファイルを作成する
  • blog.js のコンテンツをコピーします
  • 古いファイルを git rm します
  • 新しいファイルの名前を変更する
  • 新しいファイルを追加する

新しいファイルの MIME タイプは「text/plain」になります。変更を Heroku にプッシュしてテストします。

これが問題でなければ、次のステップは実行することです:

heroku run bash

そして、Heroku でアプリが想定している場所にファイルが存在するかどうかを確認します。それでも問題が解決しない場合は、これらの調査の結果を投稿してください。

お知らせ下さい!

参考:Mac開発者ライブラリ:「file」コマンド

于 2013-01-22T21:37:54.277 に答える
1

奇妙な行動; 以下を使用してデバッグしてみてください。

console.log( __dirname );

次のパスが正しいことを確認してください(blog.jsファイルを指している):

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

次に、それを明示的にrequire:(何__dirnameが返されるかによって異なる場合があります)に渡してみてください。

var blog = require( __dirname + '/blog/blog' ).blog;
于 2013-01-25T14:13:47.197 に答える