node.jsgitexpressherokumongoose-web-server

Heroku runs fine local but not online


So looking at my logs, I see this:

2016-10-24T05:42:16.071986+00:00 app[web.1]: var app = express();
2016-10-24T05:42:16.071987+00:00 app[web.1]:           ^
2016-10-24T05:42:16.071987+00:00 app[web.1]: 
2016-10-24T05:42:16.071988+00:00 app[web.1]: TypeError: express is not a function
2016-10-24T05:42:16.071989+00:00 app[web.1]:     at Object.<anonymous> (/app/app.js:2:11)
2016-10-24T05:42:16.071989+00:00 app[web.1]:     at Module._compile (module.js:413:34)
2016-10-24T05:42:16.071990+00:00 app[web.1]:     at Object.Module._extensions..js (module.js:422:10)
2016-10-24T05:42:16.071990+00:00 app[web.1]:     at Module.load (module.js:357:32)
2016-10-24T05:42:16.071990+00:00 app[web.1]:     at Function.Module._load (module.js:314:12)
2016-10-24T05:42:16.071991+00:00 app[web.1]:     at Function.Module.runMain (module.js:447:10)
2016-10-24T05:42:16.071991+00:00 app[web.1]:     at startup (node.js:148:18)
2016-10-24T05:42:16.071995+00:00 app[web.1]:     at node.js:405:3
2016-10-24T05:42:16.162284+00:00 heroku[web.1]: State changed from starting to crashed
2016-10-24T05:42:25.379955+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/local" host=murmuring-reef-69157.herokuapp.com request_id=3c2c9cc9-d1b2-48b1-b628-bd5d8030fd0e fwd="98.210.167.212" dyno= connect= service= status=503 bytes=
2016-10-24T05:42:26.006599+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=murmuring-reef-69157.herokuapp.com request_id=f4507e17-8202-46cf-ad81-4737ccd1bbab fwd="98.210.167.212" dyno= connect= service= status=503 bytes=
2016-10-24T05:48:10.261072+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=murmuring-reef-69157.herokuapp.com request_id=f3d0a1b2-4d0c-4ad7-af35-d18e0b3e6e72 fwd="98.210.167.212" dyno= connect= service= status=503 bytes=
2016-10-24T05:48:10.866238+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=murmuring-reef-69157.herokuapp.com request_id=12526a0f-14c2-4ecf-88c7-a656000c9d6d fwd="98.210.167.212" dyno= connect= service= status=503 bytes=
2016-10-24T05:49:48.551924+00:00 heroku[web.1]: State changed from crashed to starting
2016-10-24T05:49:51.371049+00:00 heroku[web.1]: Starting process with command `node app.js`
2016-10-24T05:49:53.339799+00:00 app[web.1]: /app/app.js:2
2016-10-24T05:49:53.339818+00:00 app[web.1]: var app = express();
2016-10-24T05:49:53.339819+00:00 app[web.1]:           ^
2016-10-24T05:49:53.339819+00:00 app[web.1]: 
2016-10-24T05:49:53.339821+00:00 app[web.1]:     at Object.<anonymous> (/app/app.js:2:11)
2016-10-24T05:49:53.339822+00:00 app[web.1]:     at Module._compile (module.js:413:34)
2016-10-24T05:49:53.339820+00:00 app[web.1]: TypeError: express is not a function
2016-10-24T05:49:53.339823+00:00 app[web.1]:     at Object.Module._extensions..js (module.js:422:10)
2016-10-24T05:49:53.339823+00:00 app[web.1]:     at Module.load (module.js:357:32)
2016-10-24T05:49:53.339824+00:00 app[web.1]:     at Function.Module._load (module.js:314:12)
2016-10-24T05:49:53.339824+00:00 app[web.1]:     at Function.Module.runMain (module.js:447:10)
2016-10-24T05:49:53.339825+00:00 app[web.1]:     at startup (node.js:148:18)
2016-10-24T05:49:53.339825+00:00 app[web.1]:     at node.js:405:3
2016-10-24T05:49:53.462911+00:00 heroku[web.1]: Process exited with status 1
2016-10-24T05:49:53.481857+00:00 heroku[web.1]: State changed from starting to crashed
2016-10-24T05:51:59.092552+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=murmuring-reef-69157.herokuapp.com request_id=83f531a2-2855-4c25-bd31-21293e939156 fwd="98.210.167.212" dyno= connect= service= status=503 bytes=
2016-10-24T05:51:59.702922+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=murmuring-reef-69157.herokuapp.com request_id=a4d24924-75a4-4440-8f14-a914ea1441f4 fwd="98.210.167.212" dyno= connect= service= status=503 bytes=
2016-10-24T05:55:27.129395+00:00 heroku[api]: Deploy 383a228 by kenzom954@gmail.com
2016-10-24T05:55:27.129485+00:00 heroku[api]: Release v9 created by kenzom954@gmail.com
2016-10-24T05:55:27.308319+00:00 heroku[slug-compiler]: Slug compilation started
2016-10-24T05:55:27.308324+00:00 heroku[slug-compiler]: Slug compilation finished
2016-10-24T05:55:27.289407+00:00 heroku[web.1]: State changed from crashed to starting
2016-10-24T05:55:30.183810+00:00 heroku[web.1]: Starting process with command `node app.js`
2016-10-24T05:55:32.094514+00:00 app[web.1]: var app = express();
2016-10-24T05:55:32.094515+00:00 app[web.1]:           ^
2016-10-24T05:55:32.094499+00:00 app[web.1]: /app/app.js:2
2016-10-24T05:55:32.094516+00:00 app[web.1]: TypeError: express is not a function
2016-10-24T05:55:32.094516+00:00 app[web.1]: 
2016-10-24T05:55:32.094517+00:00 app[web.1]:     at Object.<anonymous> (/app/app.js:2:11)
2016-10-24T05:55:32.094518+00:00 app[web.1]:     at Module._compile (module.js:413:34)
2016-10-24T05:55:32.094519+00:00 app[web.1]:     at Object.Module._extensions..js (module.js:422:10)
2016-10-24T05:55:32.094520+00:00 app[web.1]:     at Module.load (module.js:357:32)
2016-10-24T05:55:32.094521+00:00 app[web.1]:     at Function.Module.runMain (module.js:447:10)
2016-10-24T05:55:32.094520+00:00 app[web.1]:     at Function.Module._load (module.js:314:12)
2016-10-24T05:55:32.094522+00:00 app[web.1]:     at startup (node.js:148:18)
2016-10-24T05:55:32.094522+00:00 app[web.1]:     at node.js:405:3
2016-10-24T05:55:32.206636+00:00 heroku[web.1]: State changed from starting to crashed
2016-10-24T05:55:32.190134+00:00 heroku[web.1]: Process exited with status 1
2016-10-24T05:58:55.619526+00:00 heroku[api]: Deploy 211f725 by kenzom954@gmail.com
2016-10-24T05:58:55.619564+00:00 heroku[api]: Release v10 created by kenzom954@gmail.com
2016-10-24T05:58:55.819150+00:00 heroku[slug-compiler]: Slug compilation started
2016-10-24T05:58:55.819157+00:00 heroku[slug-compiler]: Slug compilation finished
2016-10-24T05:58:56.098775+00:00 heroku[web.1]: State changed from crashed to starting
2016-10-24T05:58:59.294388+00:00 heroku[web.1]: Starting process with command `node app.js`
2016-10-24T05:59:01.290759+00:00 app[web.1]: module.js:341
2016-10-24T05:59:01.290772+00:00 app[web.1]:     throw err;
2016-10-24T05:59:01.290773+00:00 app[web.1]:     ^
2016-10-24T05:59:01.290774+00:00 app[web.1]: 
2016-10-24T05:59:01.290775+00:00 app[web.1]: Error: Cannot find module 'body-parser'
2016-10-24T05:59:01.290776+00:00 app[web.1]:     at Function.Module._resolveFilename (module.js:339:15)
2016-10-24T05:59:01.290776+00:00 app[web.1]:     at Function.Module._load (module.js:290:25)
2016-10-24T05:59:01.290777+00:00 app[web.1]:     at Module.require (module.js:367:17)
2016-10-24T05:59:01.290778+00:00 app[web.1]:     at require (internal/module.js:20:19)
2016-10-24T05:59:01.290778+00:00 app[web.1]:     at Object.<anonymous> (/app/app.js:3:18)
2016-10-24T05:59:01.290779+00:00 app[web.1]:     at Module._compile (module.js:413:34)
2016-10-24T05:59:01.290780+00:00 app[web.1]:     at Object.Module._extensions..js (module.js:422:10)
2016-10-24T05:59:01.290780+00:00 app[web.1]:     at Module.load (module.js:357:32)
2016-10-24T05:59:01.290781+00:00 app[web.1]:     at Function.Module._load (module.js:314:12)
2016-10-24T05:59:01.290781+00:00 app[web.1]:     at Function.Module.runMain (module.js:447:10)
2016-10-24T05:59:01.369506+00:00 heroku[web.1]: State changed from starting to crashed
2016-10-24T05:59:01.356300+00:00 heroku[web.1]: Process exited with status 1
2016-10-24T05:59:03.922494+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=murmuring-reef-69157.herokuapp.com request_id=167632f8-7e55-4961-9a96-c630a5bfd05c fwd="98.210.167.212" dyno= connect= service= status=503 bytes=
2016-10-24T05:59:04.559487+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=murmuring-reef-69157.herokuapp.com request_id=2facb77e-53f1-4f95-b150-7f7e05b9622e fwd="98.210.167.212" dyno= connect= service= status=503 bytes=
2016-10-24T06:01:06.014637+00:00 heroku[web.1]: State changed from crashed to starting
2016-10-24T06:01:09.793263+00:00 heroku[web.1]: Starting process with command `node app.js`
2016-10-24T06:01:11.927280+00:00 app[web.1]: module.js:341
2016-10-24T06:01:11.927293+00:00 app[web.1]:     throw err;
2016-10-24T06:01:11.927294+00:00 app[web.1]: 
2016-10-24T06:01:11.927294+00:00 app[web.1]:     ^
2016-10-24T06:01:11.927295+00:00 app[web.1]: Error: Cannot find module 'body-parser'
2016-10-24T06:01:11.927296+00:00 app[web.1]:     at Function.Module._resolveFilename (module.js:339:15)
2016-10-24T06:01:11.927296+00:00 app[web.1]:     at Function.Module._load (module.js:290:25)
2016-10-24T06:01:11.927297+00:00 app[web.1]:     at Module.require (module.js:367:17)
2016-10-24T06:01:11.927297+00:00 app[web.1]:     at require (internal/module.js:20:19)
2016-10-24T06:01:11.927298+00:00 app[web.1]:     at Object.<anonymous> (/app/app.js:3:18)
2016-10-24T06:01:11.927299+00:00 app[web.1]:     at Module._compile (module.js:413:34)
2016-10-24T06:01:11.927299+00:00 app[web.1]:     at Object.Module._extensions..js (module.js:422:10)
2016-10-24T06:01:11.927300+00:00 app[web.1]:     at Module.load (module.js:357:32)
2016-10-24T06:01:11.927300+00:00 app[web.1]:     at Function.Module._load (module.js:314:12)
2016-10-24T06:01:11.927301+00:00 app[web.1]:     at Function.Module.runMain (module.js:447:10)
2016-10-24T06:01:12.028090+00:00 heroku[web.1]: Process exited with status 1
2016-10-24T06:01:12.045170+00:00 heroku[web.1]: State changed from starting to crashed

However, I made sure to npm install my package.json before pushing to git push heroku master.

When I run locally by heroku local it works fine, but heroku open leads me to those erros.

app.js

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var port = process.env.PORT ||  3000;
var crypto = require("crypto");
var path = require('path');
var config = require('./config'); // holds information about hosting
var Url = require('./models/Url.model'); //this holds our Schema model
var LookUp = require('./models/Lookup.model.js'); //this holds our Schema lookup
var db ='mongodb://heroku_0xrn515v:v09cpj5t25qtm73klv2poj5n5h@ds031157.mlab.com:31157/heroku_0xrn515v'

mongoose.connect(db)
app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.get('/',function(req,res){
  res.sendFile(path.join(__dirname, 'views/index.html'));
})

app.post('/api/shorten',function(req,res){
  var regex = /https:\/\/|http:\/\//
    //Check if the user input correctly with http or https format
    //if true, proceed. Otherwise, return a string with home direct link
  if(regex.test(req.body.long_url)){
    var longUrl = req.body.long_url;
    var shortUrl = ""
    //check if document (url) exist already in collection
    Url.findOne({
      long_url : longUrl
    })
      .exec(function(err,result){
        if (err) throw err
        else{
          //if the long url is in the collection, simply return the short_url
          if(result){
            LookUp.findOne({
              key: result._id
            })
              .exec(function(err,result){
                res.send({shortUrl: config.webhost + result.shortUrl,
                  shortUrlString: config.webhost + result.shortUrl })
              })
          }
          //if the long url isn't in the collection, make a new short_url for it
          else{
            var newUrl = new Url();
            newUrl.long_url = longUrl
            newUrl.save( function(err,result){
              if(err){
                console.log('error!')
              } else{
                var newLookUp = new LookUp();
                newLookUp.key = result._id;
                var id = crypto.randomBytes(2).toString('hex');
                newLookUp.shortUrl = id
                newLookUp.save( function( err, result){
                  if (err) throw err
                  else{
                    res.send({shortUrl: config.webhost + result.shortUrl,
                    shortUrlString: config.webhost + result.shortUrl})
                  }
                })
              }
            })
          }
        }
      })
  } else{
    res.send({shortUrl: "#"
      ,shortUrlString: 'Remember to put in https:// format!'})
  }
})

app.get('/:id', function(req, res){
  var shortenURL = req.params.id;
  LookUp.findOne({
    shortUrl: shortenURL
  })
    .exec(function(err,result){
      Url.findOne({
        _id: result.key
      })
        .exec(function(err,resultLink){
          res.redirect(resultLink.long_url)
        })
    })
});

app.listen(port,function(){
  console.log('listening in port', port)
})

package.json

{
  "name": "shortenerurl",
  "version": "1.0.0",
  "description": "",
  "main": "",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node app.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "crypto": "0.0.3",
    "express": "^4.14.0",
    "mongoose": "^4.6.5"
  }
}

Procfile

web: node app.js

What am I missing?


Solution

  • Could be a problem with the Node version that Heroku is using. You could try setting Heroku to use the same one you use locally. Also, you don't need to do an npm install before deploying to Heroku, as it will to it for you when you deploy (so don't include the node_module folder on git).