Heroku节点+反应app:锚标记auth请求未处理

时间:2017-09-28 09:55:20

标签: node.js reactjs express heroku

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

我的服务器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: 应用程序启动 - >我点击了Google登录' - > GET请求" / auth / google" - > google oauth flow - >重定向到" /"并且我的反应应用程序重新出现,用户已登录。

的Heroku: 在my-app.herokuapp.com/上反应应用程序 - >点击" Google登录" - >页面重新加载,没有任何反应。用户未登录。

拜托,伙计们,帮助我。 感谢

3 个答案:

答案 0 :(得分:1)

这是默认情况下安装服务工作者以使您的应用成为Progressive Web App

的结果

要确定这是否是您的问题,请在隐身模式下测试您的heroku制作模式应用。 / auth / google的请求现在应该到达服务器并且与开发中的行为一样。

确定问题后,您可以删除

import registerServiceWorker from "./registerServiceWorker";

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

您的浏览器缓存可能已包含已安装的服务工作者,因此您可能需要

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您已经阅读了Stephen Grider的教程,我想知道的一件事是:您的password.js文件位于配置文件还是服务中?我看您是用index.js写的:require('./config/passport') 而index.js中的我是require('./services/passport')

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