【问题标题】:deployment: Angular 2/Node.js app to Heroku部署:Angular 2/Node.js 应用到 Heroku
【发布时间】:2017-05-14 23:48:23
【问题描述】:

我正在尝试将我的 Angular 2/Node.js 项目部署到 Heroku,但我做错了。我相信问题可能出在我的 package.json 或 angular-cli.json 文件上。它在本地运行良好,只是不能与 Heroku 一起使用。我的服务器文件夹位于根目录。下面是我的 package.json 和 angular-cli.json 和 server.js 文件。 Heroku 日志在最后。非常感谢!

package.json:

    {
  "name": "piano2",
  "version": "0.0.0",
  "license": "MIT",
  "angular-cli": {},
  "scripts": {
    "start": "node server/server.js",
    "lint": "tslint \"src/**/*.ts\"",
    "test": "ng test",
    "pree2e": "webdriver-manager update",
    "e2e": "protractor",
    "postinstall": "ng build && mv dist/* ."
  },
  "engine": {
    "node": "6.5.0"
  },
  "private": true,
  "dependencies": {
    "@angular/common": "~2.1.0",
    "@angular/compiler": "~2.1.0",
    "@angular/core": "~2.1.0",
    "@angular/forms": "~2.1.0",
    "@angular/http": "~2.1.0",
    "@angular/platform-browser": "~2.1.0",
    "@angular/platform-browser-dynamic": "~2.1.0",
    "@angular/router": "~3.1.0",
    "body-parser": "^1.15.2",
    "core-js": "^2.4.1",
    "express": "^4.14.0",
    "mongodb": "^2.2.16",
    "mongoose": "^4.7.2",
    "rxjs": "5.0.0-beta.12",
    "ts-helpers": "^1.1.1",
    "zone.js": "^0.6.23",
    "@types/jasmine": "^2.2.30",
    "@types/node": "^6.0.42",
    "angular-cli": "1.0.0-beta.19-3",
    "codelyzer": "1.0.0-beta.1",
    "jasmine-core": "2.4.1",
    "jasmine-spec-reporter": "2.5.0",
    "karma": "1.2.0",
    "karma-chrome-launcher": "^2.0.0",
    "karma-cli": "^1.0.1",
    "karma-jasmine": "^1.0.2",
    "karma-remap-istanbul": "^0.2.1",
    "protractor": "4.0.9",
    "ts-node": "1.2.1",
    "tslint": "3.13.0",
    "typescript": "~2.0.3",
    "webdriver-manager": "10.2.5"
  },
  "devDependencies": {
  }
}

angular-cli.json:
    {
  "project": {
    "version": "1.0.0-beta.19-3",
    "name": "piano2"
  },
  "apps": [
    {
      "root": "src",
      "outDir": "dist",
      "assets": [
        "./assets/images"
      ],
      "index": "index.html",
      "main": "main.ts",
      "test": "test.ts",
      "tsconfig": "tsconfig.json",
      "prefix": "app",
      "mobile": false,
      "styles": [
          "styles.scss"
      ],
      "scripts": [],
      "environments": {
        "source": "environments/environment.ts",
        "dev": "environments/environment.ts",
        "prod": "environments/environment.prod.ts"
      }
    }
  ],
  "addons": [],
  "packages": [],
  "e2e": {
    "protractor": {
      "config": "./protractor.conf.js"
    }
  },
  "test": {
    "karma": {
      "config": "./karma.conf.js"
    }
  },
  "defaults": {
    "styleExt": "scss",
    "prefixInterfaces": false,
    "inline": {
      "style": false,
      "template": false
    },
    "spec": {
      "class": false,
      "component": true,
      "directive": true,
      "module": false,
      "pipe": true,
      "service": true
    }
  }
}

server.js:

const express = require('express');
const bodyParser = require('body-parser');

const app = express();

const http = require('http').createServer(app);
const port = process.env.PORT || 3030;

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(express.static(__dirname + '/../dist'));


//get all students on waitlist - test
app.get('/waitlist', (req, res) => {
    res.status(200).send('waitlist route working');
});


http.listen(port, () => {
    console.log(`started on port ${port}`);
});

heroku 日志:

bash-3.2$ heroku logs
2016-12-29T22:49:49.839948+00:00 heroku[web.1]: Starting process with command `npm start`
2016-12-29T22:49:52.904836+00:00 app[web.1]:
2016-12-29T22:49:52.904858+00:00 app[web.1]: > piano2@0.0.0 start /app
2016-12-29T22:49:52.904859+00:00 app[web.1]: > http-server
2016-12-29T22:49:52.904860+00:00 app[web.1]:
2016-12-29T22:49:53.226846+00:00 app[web.1]: Available on:
2016-12-29T22:49:53.226834+00:00 app[web.1]: Starting up http-server, serving ./
2016-12-29T22:49:53.226848+00:00 app[web.1]:   http://127.0.0.1:15433
2016-12-29T22:49:53.226849+00:00 app[web.1]:   http://172.16.115.150:15433
2016-12-29T22:49:53.226850+00:00 app[web.1]: Hit CTRL-C to stop the server
2016-12-29T22:49:53.614986+00:00 heroku[web.1]: State changed from starting to up
2016-12-29T22:49:55.144999+00:00 app[web.1]: [Thu Dec 29 2016 22:49:55 GMT+0000 (UTC)] "GET /" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrom
e/55.0.2883.95 Safari/537.36"
2016-12-29T22:49:55.328593+00:00 app[web.1]: [Thu Dec 29 2016 22:49:55 GMT+0000 (UTC)] "GET /inline.js" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gec
ko) Chrome/55.0.2883.95 Safari/537.36"
2016-12-29T22:49:55.392442+00:00 app[web.1]: [Thu Dec 29 2016 22:49:55 GMT+0000 (UTC)] "GET /styles.bundle.js" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, l
ike Gecko) Chrome/55.0.2883.95 Safari/537.36"
2016-12-29T22:49:55.142604+00:00 heroku[router]: at=info method=GET path="/" host=traciepiano.herokuapp.com request_id=7017f21f-99fb-4053-aab1-ed878745a021 fwd="204.132.140.130" dyno=web.1
 connect=1ms service=30ms status=200 bytes=2226
2016-12-29T22:49:55.369789+00:00 heroku[router]: at=info method=GET path="/styles.bundle.js" host=traciepiano.herokuapp.com request_id=616a85d9-ecbf-470f-ae16-35725312f415 fwd="204.132.140
.130" dyno=web.1 connect=1ms service=4ms status=200 bytes=22737
2016-12-29T22:49:55.466759+00:00 heroku[router]: at=info method=GET path="/main.bundle.js" host=traciepiano.herokuapp.com request_id=39ddd13d-5f8d-4c4f-a7c3-04678a87b5c9 fwd="204.132.140.1
30" dyno=web.1 connect=1ms service=58ms status=200 bytes=2798476
2016-12-29T22:49:55.308084+00:00 heroku[router]: at=info method=GET path="/inline.js" host=traciepiano.herokuapp.com request_id=508c14b8-c00d-45e7-ba0a-d1940cc33243 fwd="204.132.140.130" d
yno=web.1 connect=1ms service=13ms status=200 bytes=5831
2016-12-29T22:49:55.424457+00:00 app[web.1]: [Thu Dec 29 2016 22:49:55 GMT+0000 (UTC)] "GET /main.bundle.js" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, lik
e Gecko) Chrome/55.0.2883.95 Safari/537.36"
2016-12-29T22:49:57.180413+00:00 heroku[router]: at=info method=GET path="/assets/images/dusk-piano.jpg" host=traciepiano.herokuapp.com request_id=a9ffd3e0-a951-4329-9dc6-56419d71a417 fwd=
"204.132.140.130" dyno=web.1 connect=1ms service=8ms status=200 bytes=98477
2016-12-29T22:49:57.188682+00:00 app[web.1]: [Thu Dec 29 2016 22:49:57 GMT+0000 (UTC)] "GET /assets/images/dusk-piano.jpg" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.
36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
2016-12-29T22:49:57.197010+00:00 app[web.1]: [Thu Dec 29 2016 22:49:57 GMT+0000 (UTC)] "GET /assets/images/piano-beginner.jpg" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/
537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
2016-12-29T22:49:57.194711+00:00 app[web.1]: [Thu Dec 29 2016 22:49:57 GMT+0000 (UTC)] "GET /assets/images/treble-note.png" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537
.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
2016-12-29T22:49:57.307412+00:00 app[web.1]: [Thu Dec 29 2016 22:49:57 GMT+0000 (UTC)] "GET /assets/images/kid-piano.jpg" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.3
6 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
2016-12-29T22:49:57.224217+00:00 heroku[router]: at=info method=GET path="/assets/images/piano-beginner.jpg" host=traciepiano.herokuapp.com request_id=cd8fee87-8190-4c95-9821-3c50e0768b56
fwd="204.132.140.130" dyno=web.1 connect=1ms service=58ms status=200 bytes=2270976
2016-12-29T22:49:57.172989+00:00 heroku[router]: at=info method=GET path="/assets/images/treble-note.png" host=traciepiano.herokuapp.com request_id=334475f2-6114-42ff-ad5e-d04222215a64 fwd
="204.132.140.130" dyno=web.1 connect=0ms service=7ms status=200 bytes=16193
2016-12-29T22:49:57.285909+00:00 heroku[router]: at=info method=GET path="/assets/images/kid-piano.jpg" host=traciepiano.herokuapp.com request_id=1e608f8d-45ac-4223-bc8d-a655beb61449 fwd="
204.132.140.130" dyno=web.1 connect=1ms service=7ms status=200 bytes=46045
2016-12-29T22:49:57.973560+00:00 heroku[router]: at=info method=GET path="/assets/images/note-favicon.ico" host=traciepiano.herokuapp.com request_id=97c91b91-bbdb-40aa-8bab-252ee288dd64 fw
d="204.132.140.130" dyno=web.1 connect=1ms service=3ms status=200 bytes=1695
2016-12-29T22:49:57.998953+00:00 app[web.1]: [Thu Dec 29 2016 22:49:57 GMT+0000 (UTC)] "GET /assets/images/note-favicon.ico" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/53
7.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
2016-12-29T23:24:40.519015+00:00 heroku[web.1]: Idling
2016-12-29T23:24:40.519512+00:00 heroku[web.1]: State changed from up to down
2016-12-29T23:24:41.379414+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2016-12-29T23:24:41.391949+00:00 app[web.1]: http-server stopped.
2016-12-29T23:24:41.543841+00:00 heroku[web.1]: Process exited with status 143
2016-12-30T00:09:05.078222+00:00 heroku[slug-compiler]: Slug compilation started
2016-12-30T00:09:05.078228+00:00 heroku[slug-compiler]: Slug compilation finished
2016-12-30T00:09:04.907892+00:00 app[api]: Deploy 8dbda8a by user russiansummer@gmail.com
2016-12-30T00:09:04.907892+00:00 app[api]: Release v8 created by user russiansummer@gmail.com
2016-12-30T00:09:05.354258+00:00 heroku[web.1]: State changed from down to starting
2016-12-30T00:09:12.278511+00:00 heroku[web.1]: Starting process with command `npm start`
2016-12-30T00:09:14.011452+00:00 app[web.1]:
2016-12-30T00:09:14.011475+00:00 app[web.1]: > piano2@0.0.0 start /app
2016-12-30T00:09:14.011476+00:00 app[web.1]: > node server/server.js
2016-12-30T00:09:14.011476+00:00 app[web.1]:
2016-12-30T00:09:14.212414+00:00 app[web.1]: started on port 56212
2016-12-30T00:09:14.416955+00:00 heroku[web.1]: State changed from starting to up
2016-12-30T00:09:15.703752+00:00 heroku[router]: at=info method=GET path="/" host=traciepiano.herokuapp.com request_id=80742a47-d64f-467c-910c-01915b32ff90 fwd="204.132.140.130" dyno=web.1
 connect=1ms service=19ms status=404 bytes=211
2016-12-30T00:09:16.106028+00:00 heroku[router]: at=info method=GET path="/favicon.ico" host=traciepiano.herokuapp.com request_id=237ecc1c-478f-4699-a0a5-831140d6ed19 fwd="204.132.140.130"
 dyno=web.1 connect=2ms service=5ms status=404 bytes=222
2016-12-30T00:09:30.202382+00:00 heroku[router]: at=info method=GET path="/" host=traciepiano.herokuapp.com request_id=5f7aaac6-3e33-4bf9-a8ae-3901f7cc711c fwd="204.132.140.130" dyno=web.1
 connect=1ms service=2ms status=404 bytes=211
2016-12-30T00:09:38.178451+00:00 heroku[router]: at=info method=GET path="/" host=traciepiano.herokuapp.com request_id=6ca72f6a-aeec-452b-871b-63aadd8614ed fwd="204.132.140.130" dyno=web.1
 connect=1ms service=2ms status=404 bytes=211
2016-12-30T00:09:50.129037+00:00 heroku[router]: at=info method=GET path="/" host=traciepiano.herokuapp.com request_id=69494ed8-6845-4f2d-b173-c8ec11b7052c fwd="204.132.140.130" dyno=web.1
 connect=1ms service=3ms status=404 bytes=211
2016-12-30T00:09:59.364675+00:00 heroku[router]: at=info method=GET path="/" host=traciepiano.herokuapp.com request_id=e5e4f7a4-288c-42c6-95e6-82511d6171e0 fwd="204.132.140.130" dyno=web.1
 connect=1ms service=2ms status=404 bytes=211
2016-12-30T00:44:16.811783+00:00 heroku[web.1]: Idling
2016-12-30T00:44:16.812250+00:00 heroku[web.1]: State changed from up to down
2016-12-30T00:44:17.284035+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2016-12-30T00:44:17.433166+00:00 heroku[web.1]: Process exited with status 143
2016-12-30T16:15:08.162285+00:00 heroku[web.1]: Unidling
2016-12-30T16:15:08.162637+00:00 heroku[web.1]: State changed from down to starting
2016-12-30T16:15:17.763714+00:00 heroku[web.1]: Starting process with command `npm start`
2016-12-30T16:15:20.610964+00:00 app[web.1]:
2016-12-30T16:15:20.610989+00:00 app[web.1]: > piano2@0.0.0 start /app
2016-12-30T16:15:20.610990+00:00 app[web.1]: > node server/server.js
2016-12-30T16:15:20.610991+00:00 app[web.1]:
2016-12-30T16:15:20.891854+00:00 app[web.1]: started on port 44891
2016-12-30T16:15:21.365539+00:00 heroku[web.1]: State changed from starting to up
2016-12-30T16:15:22.291276+00:00 heroku[router]: at=info method=GET path="/" host=traciepiano.herokuapp.com request_id=df8acbc3-8ca6-40d4-ab74-a3c5ebe4de3d fwd="50.255.203.201" dyno=web.1
connect=1ms service=23ms status=404 bytes=211
2016-12-30T16:49:57.746673+00:00 heroku[web.1]: Idling
2016-12-30T16:49:57.748210+00:00 heroku[web.1]: State changed from up to down
2016-12-30T16:49:58.258963+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2016-12-30T16:49:58.465983+00:00 heroku[web.1]: Process exited with status 143
2016-12-30T17:09:48.479604+00:00 heroku[web.1]: Unidling
2016-12-30T17:09:48.479957+00:00 heroku[web.1]: State changed from down to starting
2016-12-30T17:09:56.691031+00:00 heroku[web.1]: Starting process with command `npm start`
2016-12-30T17:09:59.474798+00:00 app[web.1]: > piano2@0.0.0 start /app
2016-12-30T17:09:59.474799+00:00 app[web.1]: > node server/server.js
2016-12-30T17:09:59.705316+00:00 app[web.1]: started on port 31775
2016-12-30T17:09:59.474782+00:00 app[web.1]:
2016-12-30T17:09:59.474800+00:00 app[web.1]:
2016-12-30T17:10:00.371115+00:00 heroku[web.1]: State changed from starting to up
2016-12-30T17:10:02.633705+00:00 heroku[router]: at=info method=GET path="/" host=traciepiano.herokuapp.com request_id=1d884212-7f66-48c9-a05a-8c1f2fdf6b2b fwd="204.132.140.130" dyno=web.1
 connect=0ms service=26ms status=404 bytes=211
2016-12-30T17:10:09.372480+00:00 heroku[router]: at=info method=GET path="/" host=traciepiano.herokuapp.com request_id=2f8ddec8-b5f4-42b6-be15-a0520fee174a fwd="204.132.140.130" dyno=web.1
 connect=0ms service=8ms status=404 bytes=211
2016-12-30T17:10:22.856390+00:00 heroku[router]: at=info method=GET path="/" host=traciepiano.herokuapp.com request_id=6559d128-8d4a-4f47-b914-630b938f5918 fwd="204.132.140.130" dyno=web.1
 connect=0ms service=1ms status=404 bytes=211
2016-12-30T17:13:12.537422+00:00 heroku[slug-compiler]: Slug compilation started
2016-12-30T17:13:12.537443+00:00 heroku[slug-compiler]: Slug compilation finished
2016-12-30T17:13:12.390345+00:00 app[api]: Deploy e9dc205 by user russiansummer@gmail.com
2016-12-30T17:13:12.390345+00:00 app[api]: Release v9 created by user russiansummer@gmail.com
2016-12-30T17:13:12.656303+00:00 heroku[web.1]: Restarting
2016-12-30T17:13:12.656727+00:00 heroku[web.1]: State changed from up to starting
2016-12-30T17:13:13.476623+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2016-12-30T17:13:13.678555+00:00 heroku[web.1]: Process exited with status 143
2016-12-30T17:13:22.354503+00:00 heroku[web.1]: Starting process with command `npm start`
2016-12-30T17:13:25.824094+00:00 app[web.1]:
2016-12-30T17:13:25.824111+00:00 app[web.1]: > piano2@0.0.0 start /app
2016-12-30T17:13:25.824112+00:00 app[web.1]: > http-server
2016-12-30T17:13:25.824113+00:00 app[web.1]:
2016-12-30T17:13:26.012032+00:00 app[web.1]: Starting up http-server, serving ./
2016-12-30T17:13:26.013000+00:00 app[web.1]:   http://127.0.0.1:37263
2016-12-30T17:13:26.012052+00:00 app[web.1]: Available on:
2016-12-30T17:13:26.013065+00:00 app[web.1]:   http://172.17.170.54:37263
2016-12-30T17:13:26.013092+00:00 app[web.1]: Hit CTRL-C to stop the server
2016-12-30T17:13:26.747859+00:00 heroku[web.1]: State changed from starting to up
bash-3.2$

当推送到heroku时:

    bash-3.2$ git push heroku master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 482 bytes | 0 bytes/s, done.
Total 5 (delta 4), 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:        NPM_CONFIG_PRODUCTION=true
remote:        NODE_ENV=production
remote:        NODE_MODULES_CACHE=true
remote:
remote: -----> Installing binaries
remote:        engines.node (package.json):  unspecified
remote:        engines.npm (package.json):   unspecified (use default)
remote:
remote:        Resolving node version (latest stable) via semver.io...
remote:        Downloading and installing node 6.9.1...
remote:        Using default npm version: 3.10.8
remote:
remote: -----> Restoring cache
remote:        Loading 2 from cacheDirectories (default):
remote:        - node_modules
remote:        - bower_components (not cached - skipping)
remote:
remote: -----> Building dependencies
remote:        Installing node modules (package.json)
remote:
remote:        > piano2@0.0.0 postinstall /tmp/build_a1020fae05e27a5e12c37c660bd1a34c
remote:        > ng build && mv dist/* .
remote:
remote:        Could not start watchman; falling back to NodeWatcher for file system events.
remote:        Visit http://ember-cli.com/user-guide/#watchman for more info.
 34% building modules 207/269 modules 62 active .63ms sealing
1ms optimizing
0ms basic module optimization
192ms module optimization
0ms advanced module optimization
18ms basic chunk optimization
0ms chunk optimization
0ms advanced chunk optimization
1ms module and chunk tree optimization
141ms module reviving
9ms module order optimization
5ms module id optimization
4ms chunk reviving
1ms chunk order optimization
13ms chunk id optimization
rem81ms hashing
1ms module assets processing
182ms chunk assets processing
3ms additional chunk assets processing
r0ms recording
0ms additional asset processing
2153ms chunk asset optimization
1914ms asset optimization
re37ms emitting
remote:        Hash: 30b6067cb5a200217b38
remote:        Version: webpack 2.1.0-beta.25
remote:        Time: 11886ms
remote:        Asset     Size  Chunks             Chunk Names
remote:        ./assets/images/google-play-badge.png  9.89 kB          [emitted]
remote:        main.bundle.js   2.8 MB    0, 2  [emitted]  main
remote:        inline.js  5.53 kB       2  [emitted]  inline
remote:        main.map  2.86 MB    0, 2  [emitted]  main
remote:        styles.map  28.8 kB    1, 2  [emitted]  styles
remote:        inline.map  5.59 kB       2  [emitted]  inline
remote:        index.html  1.94 kB          [emitted]
remote:        ./assets/images/appStore.svg  12.4 kB          [emitted]
remote:        ./assets/images/dusk-piano.jpg  98.2 kB          [emitted]
remote:        styles.bundle.js  22.4 kB    1, 2  [emitted]  styles
remote:        ./assets/images/kid-piano.jpg  45.8 kB          [emitted]
remote:        ./assets/images/note-favicon.ico  1.41 kB          [emitted]
remote:        ./assets/images/one-note.svg  3.66 kB          [emitted]
remote:        ./assets/images/piano-beginner.jpg  2.27 MB          [emitted]
remote:        ./assets/images/play-button.png  1.46 kB          [emitted]
remote:        ./assets/images/square_cash.png  20.7 kB          [emitted]
remote:        ./assets/images/treble-note.png  15.9 kB          [emitted]
remote:        ./assets/images/venmo-app.png  31.3 kB          [emitted]
remote:        chunk    {0} main.bundle.js, main.map (main) 2.26 MB {1} [initial] [rendered]
remote:        chunk    {1} styles.bundle.js, styles.map (styles) 22.1 kB {2} [initial] [rendered]
remote:        chunk    {2} inline.js, inline.map (inline) 0 bytes [entry] [rendered]
remote:        Child html-webpack-plugin for "index.html":
remote:        Asset     Size  Chunks       Chunk Names
remote:        index.html  4.51 kB       0
remote:        chunk    {0} index.html 2.05 kB [entry] [rendered]
remote:
remote: -----> Caching build
remote:        Clearing previous node cache
remote:        Saving 2 cacheDirectories (default):
remote:        - node_modules
remote:        - bower_components (nothing to cache)
remote:
remote: -----> Build succeeded!
remote:        ├── @angular/common@2.1.2
remote:        ├── UNMET PEER DEPENDENCY @angular/compiler@2.1.2
remote:        ├── UNMET PEER DEPENDENCY @angular/core@2.1.2
remote:        ├── @angular/forms@2.1.2
remote:        ├── @angular/http@2.1.2
remote:        ├── @angular/platform-browser@2.1.2
remote:        ├── @angular/platform-browser-dynamic@2.1.2
remote:        ├── @angular/router@3.1.2
remote:        ├── @types/jasmine@2.5.39
remote:        ├── @types/node@6.0.54
remote:        ├── angular-cli@1.0.0-beta.19-3
remote:        ├── body-parser@1.15.2
remote:        ├── codelyzer@1.0.0-beta.1
remote:        ├── core-js@2.4.1
remote:        ├── express@4.14.0
remote:        ├── jasmine-core@2.4.1
remote:        ├── jasmine-spec-reporter@2.5.0
remote:        ├── karma@1.2.0
remote:        ├── karma-chrome-launcher@2.0.0
remote:        ├── karma-cli@1.0.1
remote:        ├── karma-jasmine@1.1.0
remote:        ├── karma-remap-istanbul@0.2.2
remote:        ├── mongodb@2.2.16
remote:        ├── mongoose@4.7.5
remote:        ├── protractor@4.0.9
remote:        ├── rxjs@5.0.0-beta.12
remote:        ├── ts-helpers@1.1.2
remote:        ├── ts-node@1.2.1
remote:        ├── tslint@3.13.0
remote:        ├── typescript@2.0.10
remote:        ├── webdriver-manager@10.2.5
remote:        └── zone.js@0.6.26
remote:
remote:  !     Unmet dependencies don't fail npm install but may cause runtime issues
remote:        https://github.com/npm/npm/issues/7494
remote:
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 66.7M
remote: -----> Launching...
remote:        Released v10
remote:        https://traciepiano.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy.... done.
To https://git.heroku.com/traciepiano.git
   e9dc205..14c8a1c  master -> master
bash-3.2$

【问题讨论】:

  • 你能在部署时发布heroku logs 的输出吗?这将向我们展示控制台输出的内容。
  • 请包含您的 server.js
  • 是的,请提供更多代码/日志
  • 尝试部署它如何ng build 然后使用静态构建包部署结果可能是最简单的。
  • 好的,添加了 server.js 和 heroku 日志。希望有帮助

标签: node.js angular heroku


【解决方案1】:

在heroku中部署之前需要修改package.json。

  1. "scripts": { // ... "postinstall": "ng build --aot -prod" },

    确保 postinstall 位于脚本的末尾元素。

  2. "angular-cli" devDependencies 移动到dependencies
  3. 在开头的script 中添加"start": "node server.js"
  4. 在最后添加引擎。

    "engines": { "node": "6.9.2", "npm": "3.10.9" }

  5. 现在创建server.js 文件。为静态文件提供dist 文件夹。

  6. 创建Procfile调用server.js

  7. 现在删除node modulesdistgit 文件夹并重新创建npm install

  8. 检查所有三个命令ng serve (localhost:3000)、node server.js(server.js 中定义的端口) 和heroku local web(默认端口:5000) 并查看所有命令是否正常工作。

  9. 现在是部署的时候了。删除 node modulesdist 并推送您的项目。删除这些文件夹是因为 heroku 将查找 package.json 文件并相应地安装 node modules。由于在postinstall 中我们提到了ng build,所以dist 文件夹也会自动创建。

git init git add . git commit -m "First Deployment" git push YOURGITURL master

注意- 假设已经安装了 angular cli、express、heroku cli 等。

package.json

{
  "name": "githubapp",
  "version": "0.0.0",
  "license": "MIT",
  "angular-cli": {},
  "scripts": {
    "start": "node server.js",
    "lint": "tslint \"src/**/*.ts\"",
    "test": "ng test",
    "pree2e": "webdriver-manager update",
    "e2e": "protractor",
    "postinstall": "ng build --aot -prod"
  },
  "private": true,
  "dependencies": {
    "@angular/common": "2.0.0",
    "@angular/compiler": "2.0.0",
    "@angular/core": "2.0.0",
    "@angular/forms": "2.0.0",
    "@angular/http": "2.0.0",
    "@angular/platform-browser": "2.0.0",
    "@angular/platform-browser-dynamic": "2.0.0",
    "@angular/router": "3.0.0",
    "angular-cli": "1.0.0-beta.15",
    "core-js": "^2.4.1",
    "express": "^4.14.0",
    "rxjs": "5.0.0-beta.12",
    "ts-helpers": "^1.1.1",
    "zone.js": "^0.6.23"
  },
  "devDependencies": {
    "@types/jasmine": "^2.2.30",
    "codelyzer": "~0.0.26",
    "jasmine-core": "2.4.1",
    "jasmine-spec-reporter": "2.5.0",
    "karma": "1.2.0",
    "karma-chrome-launcher": "^2.0.0",
    "karma-cli": "^1.0.1",
    "karma-jasmine": "^1.0.2",
    "karma-remap-istanbul": "^0.2.1",
    "protractor": "4.0.5",
    "ts-node": "1.2.1",
    "tslint": "3.13.0",
    "typescript": "2.0.2"
  },
  "engines": {
    "node": "6.5.0",
    "npm": "3.10.6"
  }
}

server.js

// server.js
const express = require('express');
const app = express();
// Run the app by serving the static files
// in the dist directory
app.use(express.static(__dirname + '/dist'));
// Start the app by listening on the default
// Heroku port
app.listen(process.env.PORT || 8080);

const forceSSL = function() {
  return function (req, res, next) {
    if (req.headers['x-forwarded-proto'] !== 'https') {
      return res.redirect(
       ['https://', req.get('Host'), req.url].join('')
      );
    }
    next();
  }
}
// Instruct the app
// to use the forceSSL
// middleware
app.use(forceSSL());

过程文件

web: node server.js

【讨论】:

  • 我尝试了很多教程来将 Angular 2 应用程序部署到 Heroku,但都没有成功。按照这个答案后,部署成功!谢谢!
猜你喜欢
  • 2017-01-31
  • 2016-11-26
  • 1970-01-01
  • 2020-10-31
  • 2017-11-26
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多