0
votes

I am trying to follow Stephen Grider's Full Stack React Course on Udemy.

I've wasted days trying to resolve a proxy error that is preventing me from following his tutorial - it doesnt seem to have any Q&A support.

In my authRoutes.js file, I have:

const passport = require('passport');

module.exports = (app) => {
  app.get(
    '/auth/google',
    passport.authenticate('google', {
      scope: ['profile', 'email']
    })
  );

  app.get(
    '/auth/google/callback',
    passport.authenticate('google'),
    (req, res) => {
      res.redirect('/dashboard')
    }
  );

  app.get('/api/logout', (req, res) => {
    req.logout();
    res.redirect('/');
  });

  app.get('/api/current_user', (req, res) => {
    res.send(req.user);
  });

};

In my passport.js file, I have:

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const OrcidStrategy = require('passport-orcid');
const LinkedinStrategy = require('passport-linkedin');
const keys = require('../config/keys');
const mongoose = require('mongoose');

const User = mongoose.model('users');

passport.serializeUser((user, done) => {
  done(null, user.id);
});

passport.deserializeUser((id, done) => {
  User.findById(id)
  .then(user => {
    done(null, user);
  });
});


passport.use(
  new GoogleStrategy({
    clientID: keys.googleClientID,
    clientSecret: keys.googleClientSecret,
    callbackURL: '/auth/google/callback',
    proxy: true
  },
  async (accessToken, refreshToken, profile, done) => {
    const existingUser = await User.findOne({ googleId: profile.id })

    if(existingUser){
      //User already exists
      return done(null, existingUser);
    }
    // create a new user
    const user = await new User({ googleId: profile.id}).save()
    done(null, user);

Stephen suggests using a proxy script in the package.json on the client side, to redirect local host 3000 to local host 5000, as follows:

"proxy": {
    "/auth/google": {
      "target": "http://localhost:5000"
    },
    "api/*": {
      "target": "http://localhost:5000"
    }
  },

When I try to run this in development, I get the following error.

Proxy error: Could not proxy request /auth/google/callback?code=4/xxx from localhost:3000 to http://localhost:5000 (ECONNRESET).

The logs give this information:

Error

2017-08-21T22:34:14.618863+00:00 app[web.1]:     at Strategy.OAuth2Strategy._createOAuthError (/app/node_modules/passport-oauth2/lib/strategy.js:376:16)

2017-08-21T22:34:14.618866+00:00 app[web.1]:     at IncomingMessage.<anonymous> (/app/node_modules/oauth/lib/oauth2.js:157:7)

2017-08-21T22:34:14.618864+00:00 app[web.1]:     at /app/node_modules/passport-oauth2/lib/strategy.js:166:45

2017-08-21T22:34:14.618867+00:00 app[web.1]:     at emitNone (events.js:110:20)

2017-08-21T22:34:14.618865+00:00 app[web.1]:     at passBackControl (/app/node_modules/oauth/lib/oauth2.js:132:9)

2017-08-21T22:34:14.618868+00:00 app[web.1]:     at IncomingMessage.emit (events.js:207:7)

2017-08-21T22:34:14.618869+00:00 app[web.1]:     at endReadableNT (_stream_readable.js:1047:12)

2017-08-21T22:34:14.618869+00:00 app[web.1]:     at _combinedTickCallback (internal/process/next_tick.js:102:11)

2017-08-21T22:34:14.618870+00:00 app[web.1]:     at process._tickCallback (internal/process/next_tick.js:161:9)

When I try to push to heroku and test it in production, I get a response saying cannot get /".

heroku logs

2017-08-21T18:07:07.553330+00:00 app[web.1]: > [email protected] start /app

2017-08-21T18:07:07.553331+00:00 app[web.1]: > node index.js

2017-08-21T18:07:07.553332+00:00 app[web.1]: 

2017-08-21T18:07:07.678891+00:00 app[web.1]: module.js:487

2017-08-21T18:07:07.678894+00:00 app[web.1]:     throw err;

2017-08-21T18:07:07.678894+00:00 app[web.1]:     ^

2017-08-21T18:07:07.678895+00:00 app[web.1]: 

2017-08-21T18:07:07.678896+00:00 app[web.1]: Error: Cannot find module 'express'

2017-08-21T18:07:07.678897+00:00 app[web.1]:     at Function.Module._load (module.js:437:25)

2017-08-21T18:07:07.678897+00:00 app[web.1]:     at Function.Module._resolveFilename (module.js:485:15)

2017-08-21T18:07:07.678898+00:00 app[web.1]:     at Module.require (module.js:513:17)

2017-08-21T18:07:07.678899+00:00 app[web.1]:     at Object.<anonymous> (/app/index.js:1:79)

2017-08-21T18:07:07.678900+00:00 app[web.1]:     at Object.Module._extensions..js (module.js:580:10)

2017-08-21T18:07:07.678900+00:00 app[web.1]:     at Module._compile (module.js:569:30)

2017-08-21T18:07:07.678899+00:00 app[web.1]:     at require (internal/module.js:11:18)

2017-08-21T18:07:07.678901+00:00 app[web.1]:     at Module.load (module.js:503:32)

2017-08-21T18:07:07.678901+00:00 app[web.1]:     at tryModuleLoad (module.js:466:12)

2017-08-21T18:07:07.678902+00:00 app[web.1]:     at Function.Module._load (module.js:458:3)

2017-08-21T18:07:07.708657+00:00 app[web.1]: npm ERR! code ELIFECYCLE

2017-08-21T18:07:07.709012+00:00 app[web.1]: npm ERR! errno 1

2017-08-21T18:07:07.709236+00:00 app[web.1]: npm ERR! [email protected] start: `node index.js`

2017-08-21T18:07:07.709696+00:00 app[web.1]: npm ERR! 

2017-08-21T18:07:07.709442+00:00 app[web.1]: npm ERR! Exit status 1

2017-08-21T18:07:07.710116+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

2017-08-21T18:07:07.709913+00:00 app[web.1]: npm ERR! Failed at the [email protected] start script.

2017-08-21T18:07:07.711990+00:00 app[web.1]: 

2017-08-21T18:07:07.712301+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:

2017-08-21T18:07:07.712514+00:00 app[web.1]: npm ERR!     /app/.npm/_logs/2017-08-21T18_07_07_696Z-debug.log

2017-08-21T18:07:07.826361+00:00 heroku[web.1]: State changed from starting to crashed

2017-08-21T18:07:07.810373+00:00 heroku[web.1]: Process exited with status 1

2017-08-21T22:33:31.000000+00:00 app[api]: Build started by user [email protected]

2017-08-21T22:33:49.588841+00:00 heroku[web.1]: State changed from crashed to starting

2017-08-21T22:33:48.364576+00:00 app[api]: Deploy c9f339cc by user [email protected]

2017-08-21T22:33:48.364576+00:00 app[api]: Release v13 created by user [email protected]

2017-08-21T22:33:31.000000+00:00 app[api]: Build succeeded

2017-08-21T22:33:53.125398+00:00 heroku[web.1]: Starting process with command `npm start`

2017-08-21T22:33:58.507062+00:00 app[web.1]: > [email protected] start /app

2017-08-21T22:33:58.507041+00:00 app[web.1]: 

2017-08-21T22:33:58.507063+00:00 app[web.1]: > node index.js

2017-08-21T22:33:58.507063+00:00 app[web.1]: 

2017-08-21T22:34:00.085012+00:00 app[web.1]: Db.prototype.authenticate method will no longer be available in the next major release 3.x as MongoDB 3.6 will only allow auth against users in the admin db and will no longer allow multiple credentials on a socket. Please authenticate using MongoClient.connect with auth credentials.

2017-08-21T22:34:00.051388+00:00 app[web.1]: (node:17) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-client

2017-08-21T22:34:00.250219+00:00 heroku[web.1]: State changed from starting to up

2017-08-21T22:34:01.338805+00:00 app[web.1]: (node:17) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html

2017-08-21T22:34:01.404941+00:00 heroku[router]: at=info method=GET path="/" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=2ms service=159ms status=404 bytes=383 protocol=https

2017-08-21T22:34:09.819224+00:00 heroku[router]: at=info method=GET path="/auth/google/callback?code=xxx" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=1ms service=296ms status=500 bytes=404 protocol=https

2017-08-21T22:34:09.818012+00:00 app[web.1]: Error

2017-08-21T22:34:09.818030+00:00 app[web.1]:     at /app/node_modules/passport-oauth2/lib/strategy.js:166:45

2017-08-21T22:34:09.818027+00:00 app[web.1]:     at Strategy.OAuth2Strategy.parseErrorResponse (/app/node_modules/passport-oauth2/lib/strategy.js:329:12)

2017-08-21T22:34:09.818028+00:00 app[web.1]:     at Strategy.OAuth2Strategy._createOAuthError (/app/node_modules/passport-oauth2/lib/strategy.js:376:16)

2017-08-21T22:34:09.818031+00:00 app[web.1]:     at /app/node_modules/oauth/lib/oauth2.js:191:18

2017-08-21T22:34:09.818032+00:00 app[web.1]:     at passBackControl (/app/node_modules/oauth/lib/oauth2.js:132:9)

2017-08-21T22:34:09.818033+00:00 app[web.1]:     at IncomingMessage.<anonymous> (/app/node_modules/oauth/lib/oauth2.js:157:7)

2017-08-21T22:34:09.818034+00:00 app[web.1]:     at emitNone (events.js:110:20)

2017-08-21T22:34:09.818035+00:00 app[web.1]:     at IncomingMessage.emit (events.js:207:7)

2017-08-21T22:34:09.818035+00:00 app[web.1]:     at endReadableNT (_stream_readable.js:1047:12)

2017-08-21T22:34:09.818036+00:00 app[web.1]:     at _combinedTickCallback (internal/process/next_tick.js:102:11)

2017-08-21T22:34:09.818036+00:00 app[web.1]:     at process._tickCallback (internal/process/next_tick.js:161:9)

2017-08-21T22:34:14.620378+00:00 heroku[router]: at=info method=GET path="/auth/google/callback?code=xxx" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=1ms service=84ms status=500 bytes=404 protocol=https

2017-08-21T22:34:14.665428+00:00 heroku[router]: at=info method=GET path="/auth/google" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=1ms service=15ms status=302 bytes=390 protocol=https

2017-08-21T22:34:14.618862+00:00 app[web.1]:     at Strategy.OAuth2Strategy.parseErrorResponse (/app/node_modules/passport-oauth2/lib/strategy.js:329:12)

2017-08-21T22:34:14.618864+00:00 app[web.1]:     at /app/node_modules/oauth/lib/oauth2.js:191:18

2017-08-21T22:34:14.618849+00:00 app[web.1]: Error

2017-08-21T22:34:14.618863+00:00 app[web.1]:     at Strategy.OAuth2Strategy._createOAuthError (/app/node_modules/passport-oauth2/lib/strategy.js:376:16)

2017-08-21T22:34:14.618866+00:00 app[web.1]:     at IncomingMessage.<anonymous> (/app/node_modules/oauth/lib/oauth2.js:157:7)

2017-08-21T22:34:14.618864+00:00 app[web.1]:     at /app/node_modules/passport-oauth2/lib/strategy.js:166:45

2017-08-21T22:34:14.618867+00:00 app[web.1]:     at emitNone (events.js:110:20)

2017-08-21T22:34:14.618865+00:00 app[web.1]:     at passBackControl (/app/node_modules/oauth/lib/oauth2.js:132:9)

2017-08-21T22:34:14.618868+00:00 app[web.1]:     at IncomingMessage.emit (events.js:207:7)

2017-08-21T22:34:14.618869+00:00 app[web.1]:     at endReadableNT (_stream_readable.js:1047:12)

2017-08-21T22:34:14.618869+00:00 app[web.1]:     at _combinedTickCallback (internal/process/next_tick.js:102:11)

2017-08-21T22:34:14.618870+00:00 app[web.1]:     at process._tickCallback (internal/process/next_tick.js:161:9)

2017-08-21T22:34:16.104098+00:00 heroku[router]: at=info method=GET path="/auth/google/callback?code=xxx" host=xxx.herokuapp.com request_id=dc8df15c-ffe0-4b58-a4aa-8e189c593b5a fwd="202.191.1.40" dyno=web.1 connect=3ms service=656ms status=404 bytes=403 protocol=https

2017-08-21T22:34:27.742845+00:00 heroku[router]: at=info method=GET path="/auth/google" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=1ms service=42ms status=302 bytes=390 protocol=https

2017-08-21T22:34:28.804666+00:00 heroku[router]: at=info method=GET path="/auth/google/callback?code=xxx" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=1ms service=464ms status=404 bytes=403 protocol=https

2017-08-21T22:34:29.557037+00:00 heroku[router]: at=info method=GET path="/auth/google" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=1ms service=8ms status=302 bytes=390 protocol=https

2017-08-21T22:34:30.642087+00:00 heroku[router]: at=info method=GET path="/auth/google/callback?code=xxx" host=enigmatic-brook-78689.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=1ms service=536ms status=404 bytes=403 protocol=https

2017-08-21T22:34:39.916993+00:00 heroku[router]: at=info method=GET path="/" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=1ms service=16ms status=404 bytes=383 protocol=https

2017-08-21T22:34:41.023527+00:00 heroku[router]: at=info method=GET path="/api/current_user" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=2ms service=18ms status=304 bytes=150 protocol=https

2017-08-21T22:34:40.958563+00:00 heroku[router]: at=info method=GET path="/api/current_user" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=1ms service=20ms status=304 bytes=150 protocol=https

2017-08-21T23:10:03.305689+00:00 heroku[web.1]: Idling

2017-08-21T23:10:03.306415+00:00 heroku[web.1]: State changed from up to down

2017-08-21T23:10:04.202040+00:00 heroku[web.1]: Stopping all processes with SIGTERM

2017-08-21T23:10:04.352701+00:00 heroku[web.1]: Process exited with status 143

2017-08-23T03:28:49.000000+00:00 app[api]: Build started by user [email protected]

2017-08-23T03:29:01.748781+00:00 app[api]: Release v14 created by user [email protected]

2017-08-23T03:29:01.748781+00:00 app[api]: Deploy 6fa5bda7 by user [email protected]

2017-08-23T03:29:02.060735+00:00 heroku[web.1]: State changed from down to starting

2017-08-23T03:28:49.000000+00:00 app[api]: Build succeeded

2017-08-23T03:29:04.226461+00:00 heroku[web.1]: Starting process with command `npm start`

2017-08-23T03:29:06.893145+00:00 app[web.1]: 

2017-08-23T03:29:06.893164+00:00 app[web.1]: > [email protected] start /app

2017-08-23T03:29:06.893165+00:00 app[web.1]: > node index.js

2017-08-23T03:29:06.893166+00:00 app[web.1]: 

2017-08-23T03:29:07.397451+00:00 app[web.1]: (node:17) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-client

2017-08-23T03:29:07.422226+00:00 app[web.1]: Db.prototype.authenticate method will no longer be available in the next major release 3.x as MongoDB 3.6 will only allow auth against users in the admin db and will no longer allow multiple credentials on a socket. Please authenticate using MongoClient.connect with auth credentials.

2017-08-23T03:29:08.014335+00:00 heroku[web.1]: State changed from starting to up

2017-08-23T03:29:33.093123+00:00 heroku[router]: at=info method=GET path="/" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=0ms service=41ms status=404 bytes=383 protocol=https

2017-08-23T03:29:33.078119+00:00 app[web.1]: (node:17) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html

2017-08-23T03:30:06.960381+00:00 heroku[router]: at=info method=GET path="/" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=0ms service=15ms status=404 bytes=383 protocol=https

2017-08-23T03:30:07.490909+00:00 heroku[router]: at=info method=GET path="/" host=xxx.herokuapp.com request_id=xxx fwd="202.191.1.40" dyno=web.1 connect=1ms service=5ms status=404 bytes=383 protocol=https

Does anyone know how to use Stephen's course approach to set up a basic mern stack app?

Has anyone had any success in overcoming these specific issues? It's a waste of time posting to Stephen's Q&A - he doesn't answer questions.

2
Error: Cannot find module 'express' have you seen this error? ;)lukaleli
Yes - I've seen the error. I'm trying to find a solution to resolve it.Mel
Perhaps check if you have express in your package.json dependencies and run npm install firstlukaleli
It's a dependency in my server side package.jsonMel
did you find any solution to this? I have the same issue. ThanksNicoara Talpes

2 Answers

0
votes

This issue is caused by migrating version from 1.1.15 to 2.0.1. To fix this, you should now remove your proxy settings in your package.json file and do this instead:

In your client folder:

$ npm install http-proxy-middleware --save
$ # or
$ yarn add http-proxy-middleware

Place entries into src/setupProxy.js like so:

const proxy = require('http-proxy-middleware')

module.exports = function(app) {
  app.use(proxy('/api', { target: 'http://localhost:5000/' }))
  app.use(proxy('/*.svg', { target: 'http://localhost:5000/' }))
}

Note: You don't have to import the setupProxy.js.

For more info, visit this link: https://github.com/facebook/create-react-app/issues/5103

0
votes
const { createProxyMiddleware }= require('http-proxy-middleware');

module.exports = function(app) {
    app.use( createProxyMiddleware('/auth/google', { target: 'http://localhost:5000' }));
    app.use( createProxyMiddleware('/api/**', { target: 'http://localhost:5000' }));
};