Heroku 节点 + react应用程序:锚标记身份验证请求未处理

IT技术 node.js reactjs express heroku
2021-05-16 01:57:37

我正在构建一个节点 + 快速服务器,前端带有 create-react-app。我使用passportjs进行身份验证路由处理,所有东西都在本地主机上工作(后端在端口5000,前端在端口3000,带有代理)。当我部署到 Heroku 时,似乎服务器无法识别我的身份验证路由,因此 heroku 提供静态 index.html。如果我用 Postman 测试我的 API 似乎都有效(我可以看到 google oauth 的 html 页面),但是在我的 React 应用程序中使用锚标记或在 url 中手动编写端点,我只能看到重新加载相同的页面。

我的服务器 index.js:

const express = require('express')
const passport = require('passport')
const mongoose = require('mongoose')
const path = require('path')

// KEYS
const keys = require('./config/keys')

// MONGOOSE MODELS
require('./models/User')

mongoose.connect(keys.mongoURI)

// PASSPORT SETUP
require('./config/passport')

// CREATE THE SERVER
const app = express()

// EXTERNAL MIDDLEWARES
require('./middlewares/external')(app)

// ROUTE HANDLERS
require('./routes/authRoutes')(app)

// PRODUCTION SETUP
if (process.env.NODE_ENV === 'production') {
  // express serve up production assets ( main.js, main.css )
  app.use(express.static('client/build'))
  app.get('*', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'))
  })
}

// START THE SERVER
const PORT = process.env.PORT || 5000
app.listen(PORT)

流动:

LOCALHOST:react 应用程序启动 -> 我点击“Google 登录” -> GET 请求到“/auth/google” -> google oauth flow -> 重定向到“/”并且我的 react 应用程序重新出现,用户已登录。

HEROKU:在 my-app.herokuapp.com/ 上响应应用程序 -> 点击“Google 登录” -> 页面重新加载,没有任何react。用户未登录。

请大家帮帮我。谢谢

3个回答

这是默认情况下安装 service worker 的结果,使您的应用程序成为渐进式 Web 应用程序

要确定这对您来说是否有问题,请在隐身模式下测试您的 heroku 生产模式应用程序。对 /auth/google 的请求现在应该到达服务器并像在开发中一样运行。

一旦你确定这是一个问题,你可以删除

import registerServiceWorker from "./registerServiceWorker";

来自您的 /client/src/index.js 文件。

您的浏览器缓存可能已经包含一个已安装的 Service Worker,因此您可能必须

  1. 清除用户浏览器上的浏览器缓存
  2. 以编程方式卸载服务器工作者

    import { unregister } from './registerServiceWorker';
    ....
    unregister();
    

我有同样的问题,完全相同的症状。

对我来说,原因是键中的拼写错误:在server/config/prod.js我读了一行,cookieKey: process.env.COOKIE_KEY但在 Heroku Config Variables 中,该变量名为cookieKey. 将其重命名为COOKIE_KEYHeroku 内部解决了该问题。

如果您遵循了 Stephen Grider 教程,我想知道一件事:您的 Passport.js 文件是在配置还是服务中?我看到你写在 index.js:require('./config/passport') 而我在 index.js 是require('./services/passport')

可能不是您对生产中挂起的 google oauth 流程的解决方案,但可能会有所帮助。