Reputation: 1140
Heroku is successfully building my application, but when I go to the deployed url I get an application error and when I check the logs I see that it cannot read the uncompiled server code it's trying to run on yarn start
.
Unlike this stack post I have a procfile and I've tested my procfile and it works fine.
I've successfully narrowed the problem down to heroku not being able to use babel to compile the server code.
Here is the log error when running heroku logs --tail
2019-02-15T22:28:03.169864+00:00 app[web.1]: yarn run v1.14.0
2019-02-15T22:28:03.298039+00:00 app[web.1]: $ NODE_ENV=production node compiled/server/server.js
2019-02-15T22:28:03.410030+00:00 app[web.1]: /app/compiled/server/server.js:1
2019-02-15T22:28:03.410035+00:00 app[web.1]: (function (exports, require, module, __filename, __dirname) { import express from 'express';
2019-02-15T22:28:03.410037+00:00 app[web.1]: ^^^^^^^
2019-02-15T22:28:03.410039+00:00 app[web.1]:
2019-02-15T22:28:03.410041+00:00 app[web.1]: SyntaxError: Unexpected identifier
2019-02-15T22:28:03.410043+00:00 app[web.1]: at new Script (vm.js:79:7)
2019-02-15T22:28:03.410045+00:00 app[web.1]: at createScript (vm.js:251:10)
2019-02-15T22:28:03.410047+00:00 app[web.1]: at Object.runInThisContext (vm.js:303:10)
2019-02-15T22:28:03.410049+00:00 app[web.1]: at Module._compile (internal/modules/cjs/loader.js:657:28)
2019-02-15T22:28:03.410051+00:00 app[web.1]: at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
2019-02-15T22:28:03.410052+00:00 app[web.1]: at Module.load (internal/modules/cjs/loader.js:599:32)
2019-02-15T22:28:03.410054+00:00 app[web.1]: at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
2019-02-15T22:28:03.410056+00:00 app[web.1]: at Function.Module._load (internal/modules/cjs/loader.js:530:3)
2019-02-15T22:28:03.410058+00:00 app[web.1]: at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
2019-02-15T22:28:03.410060+00:00 app[web.1]: at startup (internal/bootstrap/node.js:283:19)
2019-02-15T22:28:03.498430+00:00 heroku[web.1]: Process exited with status 1
Here are my npm scripts:
"scripts": {
"dev": "./node_modules/.bin/nodemon.js server/server.js --watch server --exec babel-node",
"build": "yarn build:next && yarn build:server",
"build:next": "next build",
"build:server": "./node_modules/.bin/babel server -d compiled/server",
"start": "NODE_ENV=production node compiled/server/server.js",
"heroku-postbuild": "yarn build && cat compiled/server/server.js"
},
Note that I added cat
to the heroku-postbuild
so that I can confirm that the server isn't being transpiled (see below).
Following the advice from the following posts:
package.json start script, babel-node: not found on heroku deploy
babel-node is not getting installed on Heroku
heroku failed at the build script but heroku local web is fine
I have moved all my babel dependencies from devDependencies to dependencies. The following heroku build log is a run with these in dependencies
. (Unlike their posts, my heroku build runs succesffuly without any warning saying it cannot find babel dependencies.
Heroku Build Logs:
orpheus@Ryan:~/code/oip/nextjs-oip-hdmw$ git push heroku master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 354 bytes | 354.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Node.js app detected
remote:
remote: -----> Creating runtime environment
remote:
remote: NPM_CONFIG_LOGLEVEL=error
remote: NODE_ENV=production
remote: NODE_MODULES_CACHE=true
remote: NODE_VERBOSE=false
remote:
remote: -----> Installing binaries
remote: engines.node (package.json): ^10.14.2
remote: engines.npm (package.json): unspecified (use default)
remote: engines.yarn (package.json): ^1.12.3
remote:
remote: Resolving node version ^10.14.2...
remote: Downloading and installing node 10.15.1...
remote: Using default npm version: 6.4.1
remote: Resolving yarn version ^1.12.3...
remote: Downloading and installing yarn (1.14.0)...
remote: Installed yarn 1.14.0
remote:
remote: -----> Restoring cache
remote: - node_modules
remote:
remote: -----> Building dependencies
remote: Installing node modules (yarn.lock)
remote: yarn install v1.14.0
remote: [1/4] Resolving packages...
remote: success Already up-to-date.
remote: Done in 1.78s.
remote: Detected both "build" and "heroku-postbuild" scripts
remote: Running heroku-postbuild (yarn)
remote: yarn run v1.14.0
remote: $ yarn build && cat compiled/server/server.js
remote: $ yarn build:next && yarn build:server
remote: $ next build
remote: [10:25:50 PM] Compiling client
remote: [10:25:51 PM] Compiling server
remote: > Using external babel configuration
remote: > Location: "/tmp/build_1571297117a8f31e1fa30a1e57c004ff/.babelrc"
remote: [10:26:01 PM] Compiled server in 10s
remote: [10:26:11 PM] Compiled client in 21s
remote: $ ./node_modules/.bin/babel server -d compiled/server
remote: Successfully compiled 2 files with Babel.
remote: import express from 'express';
remote: import next from 'next';
remote: import path from 'path';
remote: import helmet from 'helmet';
remote:
remote: require('dotenv').config();
remote:
remote: import logger from './logs';
remote:
remote: var _require = require(path.resolve('./', 'lib/api/getRootUrl')),
remote: getRootUrl = _require.getRootUrl;
remote:
remote: var dev = process.env.NODE_ENV !== 'production';
remote: var port = process.env.PORT || 7000;
remote: var ROOT_URL = getRootUrl();
remote: var app = next({
remote: dev: dev
remote: });
remote: var handle = app.getRequestHandler();
remote: var URL_MAP = {
remote: // example URL_MAP
remote: '/load': '/public/load'
remote: };
remote: app.prepare().then(function () {
remote: var server = express();
remote: server.use(helmet());
remote:
remote: if (!dev) {
remote: server.set('trust proxy', 1);
remote: }
remote:
remote: server.get('*', function (req, res) {
remote: var url = URL_MAP[req.path];
remote:
remote: if (url) {
remote: var query = req.query.query;
remote: app.render(req, res, url, query);
remote: } else {
remote: handle(req, res);
remote: }
remote: });
remote: server.listen(port, function (err) {
remote: if (err) throw err;
remote: logger.info("> Ready on ".concat(ROOT_URL));
remote: });
remote: });Done in 24.59s.
remote:
remote: -----> Caching build
remote: - node_modules
remote:
remote: -----> Pruning devDependencies
remote: yarn install v1.14.0
remote: [1/4] Resolving packages...
remote: [2/4] Fetching packages...
remote: info [email protected]: The platform "linux" is incompatible with this module.
remote: info "[email protected]" is an optional dependency and failed compatibility check. Excluding it from installation.
remote: [3/4] Linking dependencies...
remote: warning " > [email protected]" has unmet peer dependency "babel-core@^6.0.0 || ^7.0.0-0".
remote: warning "next-images > [email protected]" has unmet peer dependency "webpack@^4.0.0".
remote: warning "next-images > [email protected]" has unmet peer dependency "webpack@^3.0.0 || ^4.0.0".
remote: [4/4] Building fresh packages...
remote: warning Ignored scripts due to flag.
remote: Done in 58.13s.
remote:
remote: -----> Build succeeded!
remote: ! Unmet dependencies don't fail yarn install but may cause runtime issues
remote: https://github.com/npm/npm/issues/7494
remote:
remote:
remote: -----> Opting in to new default build script behavior
remote: You have set "heroku-run-build-script"=true in your package.json
remote: Your app will be unaffected by the change on March 11, 2019
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 130.6M
remote: -----> Launching...
remote: Released v21
remote: https://limitless-thicket-16836.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/limitless-thicket-16836.git
441f024..97d87ef master -> master
After these two lines:
remote: $ ./node_modules/.bin/babel server -d compiled/server
remote: Successfully compiled 2 files with Babel.
You can see the cat
'd server code untranspiled.
And when I open the deploy link it outputs I get an error with logs that I already posted above (Unexpected identifier)
The only thing I've been able to do is to transpile my code before pushing to Heroku and have heroku just run next build
.
My dependencies:
"dependencies": {
"@babel/cli": "^7.2.3",
"@babel/core": "^7.2.2",
"@babel/node": "^7.2.2",
"@babel/preset-env": "^7.2.3",
"babel-eslint": "^10.0.1",
"babel-jest": "^23.6.0",
...
}
What am I missing? How can I get Heroku to correctly use babel to transpile my code?
Upvotes: 0
Views: 1466
Reputation: 123
Your dependencies looks good, add this script in your package.json
"heroku-prebuild": "rm -rf node_modules",
Upvotes: 2