在 Heroku 上部署 react/apollo-server 应用程序

Posted

技术标签:

【中文标题】在 Heroku 上部署 react/apollo-server 应用程序【英文标题】:Deploying react/apollo-server app onto Heroku 【发布时间】:2019-10-21 10:37:12 【问题描述】:

我正在尝试将 react / apollo-server 全栈应用程序部署到 heroku。因此,我尝试从 express/apollo-server 后端提供静态客户端文件,如下所示:

const path = require('path');

const express = require('express');
const app = express();
const cors = require('cors');
const  ApolloServer  = require('apollo-server');

const  schema  = require('./schema');
const  resolvers  = require('./resolvers');

app.use(cors());

app.use(express.static('public'));

app.get('*', (req, res) => 
  res.sendFile(path.resolve(__dirname, 'public', 'index.html'));
);

const server = new ApolloServer(
  typeDefs: schema,
  resolvers,
);

server.listen( port: process.env.PORT || 4000 ).then(( url ) => 
  console.log(`????  Server ready at $url`);
);

由于某种原因,我不明白客户端在部署到 heroku 时没有提供服务。在 heroku URL 上我得到:GET query missing. 如果我在生产中将 graphql 设置为启用,我可以看到它,我可以解析数据。但是客户端没有呈现。我用 * 猜测 app.get 不起作用,然后 index.html 没有被捕获。

我该如何解决这个问题?

谢谢!

【问题讨论】:

【参考方案1】:

您遇到的错误是因为您仅将 ApolloServer 中的 server 公开到端口 4000,而没有使用前端客户端应用程序公开 app

为了部署全栈应用程序,您还必须公开app,为此您可以使用ApolloServer 中的applyMiddleware 并绑定阿波罗服务器和前端客户端,例如:

.....

app.get('*', (req, res) => 
  res.sendFile(path.resolve(__dirname, 'public', 'index.html'));
);

const server = new ApolloServer(
  typeDefs: schema,
  resolvers,
);

server.applyMiddleware(
  path: '/my-frontend', // you should change this to whatever you want
  app,
);

app.listen( port: process.env.PORT || 4000 , () => 
  console.log(`?  Server ready at http://localhost:4000`);
);

现在您应该能够导航到 http://localhost:4000/my-frontend 并查看您的客户端应用程序。

希望对你有帮助。

【讨论】:

以上是关于在 Heroku 上部署 react/apollo-server 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Heroku 上部署 Django\Tornado

在 Heroku 上部署时未找到模块错误

在 Heroku 上部署 React 和 Django

在 Heroku 上部署 asgi 和 wsgi

如何在 Heroku 上部署 Flutter Web

在heroku上部署django网站时出错