本地生产和开发工作,但heroku仅使用快速服务器调用

时间:2018-01-29 11:00:36

标签: node.js reactjs express heroku npm

修改。 heroku只是获取或使用我的服务器文件,仍然试图弄清楚如何让它使用客户端。'

我正在尝试获取我在heroku上构建的第一个应用程序。我没有完成它,但它的基础工作正常,当我运行npm run dev.并使用我的localhost中的生产时,它的版本到目前为止工作正常。

当我尝试将它推送到heroku时,我在页面上得到无法获取/ ,当我检查我在快递中识别的其他路径时,我得到原始json数据回来了。问题是看起来我的客户可能会被忽略,所以我确定我在我的package.json中搞砸了。

我使用create-react-app启动了这个,客户端和服务器都有自己的包。

在server.js中

文件路径(为了可见性而编辑了一些代码。注释掉加入文件路径什么也没做,所以这可能不是问题):

const path = require('path');
// const publicPath = path.join(__dirname, './client/build'); //maybe this?
const express = require('express');
const app = express();

var mongoose = require('mongoose');
var {mongoose} = require('./server/db/mongoose');

const port = process.env.PORT || 8000;
//app.use('/', express.static(`${__dirname}/client/build`)); //or this?

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

server package.JSON(不知道我是否需要启动脚本。):

{
  "name": "example-create-react-app-express",
  "version": "1.0.0",
  "scripts": {
    "start": "node server.js",
    "client": "cd client && npm run start",
    "server": "nodemon server.js",
    "dev": "concurrently --kill-others-on-fail \"npm run server\" \"npm run client\""
  },
  "engines": {
    "node": "9.3.0"
  },
  "dependencies": {
    "body-parser": "^1.18.2",
    "express": "^4.16.2",
    "lodash": "^4.17.4",
    "mongoose": "^5.0.1"
  },
  "devDependencies": {
    "concurrently": "^3.5.0"
  }
}

客户端package.JSON(我已经运行了npm run-script build):

{
  "name": "example-create-react-app-express",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "history": "^4.7.2",
    "prop-types": "^15.6.0",
    "react": "^16.2.0",
    "react-dom": "^16.2.0",
    "react-router-dom": "^4.2.2",
    "react-scripts": "1.1.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  },
  "proxy": "http://localhost:8000/"
}

Heroku构建日志(表示成功,但在npm_config_loglevel中出错):

-----> Node.js app detected
-----> Creating runtime environment

       NPM_CONFIG_LOGLEVEL=error
       NPM_CONFIG_PRODUCTION=true
       NODE_VERBOSE=false
       NODE_ENV=production
       NODE_MODULES_CACHE=true
-----> Installing binaries
       engines.node (package.json):  9.3.0
       engines.npm (package.json):   unspecified (use default)

       Resolving node version 9.3.0...
       Downloading and installing node 9.3.0...
       Using default npm version: 5.5.1
-----> Restoring cache
       Loading 2 from cacheDirectories (default):
       - node_modules
       - bower_components (not cached - skipping)
-----> Building dependencies
       Installing node modules (package.json + package-lock)
       up to date in 0.596s
-----> Caching build
       Clearing previous node cache
       Saving 2 cacheDirectories (default):
       - node_modules
       - bower_components (nothing to cache)
-----> Build succeeded!
-----> Discovering process types
       Procfile declares types     -> (none)
       Default types for buildpack -> web
-----> Compressing...
       Done: 19.1M
-----> Launching...
       Released v11
       (site) deployed to Heroku

Here是github文件的链接,如果您可以更容易地看到与文件路径相关的包。

同样,这是未完成的,但在使用npm run dev and a local production server 时完全正常工作。 Heroku正在工作,但不是应该的。我使用的是node v9.3,mongo v3.2。我之前的回复说可以通过向服务器package.json添加一个heroku postbuild来修复它,但是当我尝试这种方法时,我的heroku推送被拒绝了。

这是一个较长的问题,但我确实陷入了困境,所以我非常感谢你们的帮助,并希望有朝一日能够回报其他新人!

2 个答案:

答案 0 :(得分:0)

它没有按预期工作的原因是由于以下原因:

  1. 您错过了Procfile
  2. 如果没有Procfile,则Heroku默认为npm run start,如here所述。这就是为什么它只是拿起你的server.js
  3. Heroku只会安装生产依赖项,这是dependenciespackage.json部分下定义的任何内容。您可以按照here的说明覆盖此指示,但通常您不会在生产中使用与开发相关的依赖关系。

答案 1 :(得分:0)

我明白了!

"install": "cd client && npm install && npm run build && cd ..",

添加到服务器package.json中的脚本中,一切正常。

此外,如果其他人有此问题,请确保您的heroku页面上有mlab mongodb作为插件。