When specified, "proxy" in package.json must be a string

Reactjs

Reactjs Problem Overview


I would like to have proxy in my react client, my package.json contains:

...
"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "proxy": {
    "/auth/google": {
      "target": "http://localhost:5000"
    }
   },
...

But when I ran it, I got error

When specified, "proxy" in package.json must be a string.
[1] Instead, the type of "proxy" was "object".
[1] Either remove "proxy" from package.json, or make it a string.

I tried to convert to string, no errors but proxy is not working

"proxy": "http://localhost:5000"

My App.js

<div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>hey there</p>
          <a href="/auth/google">Sign In With Google</a>
        </header>
      </div>
    

Reactjs Solutions


Solution 1 - Reactjs

The issue that you are facing is because of CRA v2.

Firstly, you will not require any additional configuration if you are just using a plain string in your proxy. But the moment you use an object, you are using advanced configuration.

So, you would have to follow the steps listed below:

  1. Install http-proxy-middleware by typing npm i --save http-proxy-middleware

  2. Remove the entries from package.json:

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

3. Now create a setup file for your proxy. You should name it setupProxy.js in your src folder on the client side and type the following code:

const proxy = require('http-proxy-middleware');
module.exports = function(app) {
    app.use(proxy('/auth/google', 
        { target: 'http://localhost:5000/' }
    ));
}

for more info check this

Solution 2 - Reactjs

I think it is "create-react-app" issue.

You can go to https://github.com/facebook/create-react-app/issues/5103 to migration to the new proxy handling method.

For short, you just need to install a new library called "http-proxy-middleware"

npm install http-proxy-middleware --save

And then create a new file "src/setupProxy.js", and type

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

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

Hope this can solve your problem, happy hacking!

Solution 3 - Reactjs

First, install http-proxy-middleware using npm or Yarn:

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

Next, create src/setupProxy.js and place the following contents in it:

const proxy = require('http-proxy-middleware')
    
module.exports = function(app) {
  // ...
}

Now, migrate each entry in your proxy object one by one, e.g.:

"proxy": {
  "/api": {
    "target": "http://localhost:5000/"
    },
  "/*.svg": {
    "target": "http://localhost:5000/"
  }
}

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/' }))
}

You can also use completely custom logic there now! I have got this working response from this link and hence sharing-https://github.com/facebook/create-react-app/issues/5103

Solution 4 - Reactjs

For people in 2020, Install http-proxy-middleware by typing npm i --save http-proxy-middleware inside the client folder.

Remove the entries from package.json:

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

Now create a setup file for your proxy. You should name it setupProxy.js in your src folder on the client side and type the following code:

const { createProxyMiddleware } = require("http-proxy-middleware");

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

PS: You don't need to include setupProxy.js anywhere in server.js or index.js. just copy and paste.

Solution 5 - Reactjs

The following worked for me:

Remove "proxy" from your package.json.

Install 'http-proxy-middleware' in the client directory. To do this, cd into the client directory and run "npm i --save http-proxy-middleware". Then, create a new file in the src directory of your client called "setupProxy.js". Place the following code in this file:

const { createProxyMiddleware } = require('http-proxy-middleware');
const proxy = require('http-proxy-middleware');
module.exports = function(app) {
    app.use(createProxyMiddleware('/api/', // replace with your endpoint
        { target: 'http://localhost:8000' } // replace with your target
    ));
}

restart the server, and you should be good to go.

Solution 6 - Reactjs

Change the proxy to something like this and hope it will work as it worked for me.

"proxy": "http://localhost:5000/auth/google"

Solution 7 - Reactjs

At this moment i'm using React 16.8.13 this works fine:

1- delete "proxy": {***} from package.json file

2- type npm install http-proxy-middleware

3- create the file src/setupProxy.js

4-insert the code as following:

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

module.exports = (app) => {
	app.use(
		createProxyMiddleware('/endpoint/*', {
			target: 'http://address/',
			secure: false,
		}),
	);
};

Solution 8 - Reactjs

If you need to proxy requests and rewrite urls, for example localhost:3000/api/backend/some/method to https://api-server.example.com/some/method, you need to use pathRewrite option also:

const {createProxyMiddleware} = require("http-proxy-middleware");

module.exports = function(app) {
  app.use(
    "/api/backend",
    createProxyMiddleware({
      target: "https://api-server.example.com",
      changeOrigin: true,
      pathRewrite: {
        "^/api/backend": "",
      },
    })
  );
};

Solution 9 - Reactjs

> install "http-proxy-middleware" into your client, "not inside server".

Add setupProxy.js inside of your client/src/ directory. (should be like this: client/src/setupProxy.js)

Add the below lines to it.

const proxy = require("http-proxy-middleware");

module.exports = app => {
   app.use(proxy("/auth/google", { target: "http://localhost:5000/" }));
};

That's it, get inside of your google dev console and add localhost:3000/auth/google/callback to your project.

Solution 10 - Reactjs

https://github.com/facebook/create-react-app/issues/5103

Move advanced proxy configuration to src/setupProxy.js

This change is only required for individuals who used the advanced proxy configuration in v1.

To check if action is required, look for the proxy key in package.json. Then, follow the table below.

I couldn't find a proxy key in package.json No action is required! The value of proxy is a string (e.g. http://localhost:5000) No action is required! The value of proxy is an object Follow the migration instructions below. If your proxy is an object, that means you are using the advanced proxy configuration.

Again, if your proxy field is a string, e.g. http://localhost:5000, you do not need to do anything. This feature is still supported and has the same behavior.

First, install http-proxy-middleware using npm or Yarn:

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

Next, create src/setupProxy.js and place the following contents in it:

const proxy = require('http-proxy-middleware')
    
module.exports = function(app) {
  // ...
}

Now, migrate each entry in your proxy object one by one, e.g.:

"proxy": {
  "/api": {
    "target": "http://localhost:5000/"
    },
  "/*.svg": {
    "target": "http://localhost:5000/"
  }
}

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/' }))
}

You can also use completely custom logic there now! This wasn't possible before.

It's worked.

Solution 11 - Reactjs

app.use(
  '/api',
  proxy({ target: 'http://www.example.org', changeOrigin: true })
);


changeOrigin:true

Solution 12 - Reactjs

This worked for me (just as several people have already replied). But I write this just in case someone asks whether this is still a valid answer in 2021.

  • Delete this from your package.json file:
  "proxy": {
            "/auth/google": {
              "target": "http://localhost:5000"
            }
  • Install proxy middleware by running npm install --save http-proxy-middleware.
  • Create setupProxy.js file in your src (right next to the index.js file) file on the frontend.
  • In that setupProxy.js file put:
const proxy = require('http-proxy-middleware');

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

Of course, your port can be anything. It does not have to be 5000. Where ever you are running your backend service at. That is it. You do not have to import this file anywhere. It works as it is.

Solution 13 - Reactjs

After creating a file in the client side (React app ) called src/setupProxy.js make sure you restart the server. The package.json file needs to restarted since you were dealing with a file outside the source directory.

Solution 14 - Reactjs

In my cases i didn't need src/setupProxy.js... I do that with axios... Check About Axios Proxy

Check in node library if you have it or not: http-proxy-middleware is optional i didn't need it!!!

Just try to restart server side, and that's it!!! Add to check:

componentDidMount(){
    axios.get('/api/path-you-want').then(response=>{
      console.log(response)
    })
  } 

Solution 15 - Reactjs

This is related to a bug in create-react-app version2.

Just run

$ npm install react-scripts@next --save
$ # or
$ yarn add react-scripts@next

Answer found at:

https://github.com/facebook/create-react-app/issues/5103

Solution 16 - Reactjs

        ...
        "scripts": {
            "start": "react-scripts start",
            "build": "react-scripts build",
            "test": "react-scripts test",
            "eject": "react-scripts eject"
          },
          "proxy": {
            "/auth/google": {
              "target": "http://localhost:5000"
            }
           },
        ...
    
    When specified, "proxy" in package.json must be a string.
    Just change `"proxy": "http://localhost:5000"` and you are good to go.
    If that doesn't solve the problem then register your proxy using **http-proxy-middleware**
    
    $ npm install http-proxy-middleware --save
    $ # or
    $ yarn add http-proxy-middleware
    
    Then create setypProxy.js file under src directory the put the following code.
const proxy = require('http-proxy-middleware');
module.exports = app => {
  app.use(
    proxy('/auth/google', {
      target: 'http://localhost:5000'
    })
  );
 app.use(
    proxy('/auth/facebook', {
      target: 'http://localhost:6000'
    })
  );
};

Solution 17 - Reactjs

Create a setupProxy.js file inside the src folder and copy-paste the below code.

const { createProxyMiddleware } = require("http-proxy-middleware");

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionrichersoonView Question on Stackoverflow
Solution 1 - ReactjsRohan DharView Answer on Stackoverflow
Solution 2 - ReactjsVincent HoView Answer on Stackoverflow
Solution 3 - ReactjsSarthView Answer on Stackoverflow
Solution 4 - Reactjsimran haiderView Answer on Stackoverflow
Solution 5 - ReactjsJonView Answer on Stackoverflow
Solution 6 - ReactjsSandip GuchaitView Answer on Stackoverflow
Solution 7 - ReactjssinaView Answer on Stackoverflow
Solution 8 - ReactjsNickView Answer on Stackoverflow
Solution 9 - ReactjsDibyajyoti GhosalView Answer on Stackoverflow
Solution 10 - ReactjsȘǻm RiďView Answer on Stackoverflow
Solution 11 - ReactjsgraceView Answer on Stackoverflow
Solution 12 - ReactjsSlaven BunijevacView Answer on Stackoverflow
Solution 13 - ReactjsaniefiokView Answer on Stackoverflow
Solution 14 - ReactjsDragan PetrovicView Answer on Stackoverflow
Solution 15 - ReactjsjLucView Answer on Stackoverflow
Solution 16 - ReactjsTikaram MardiView Answer on Stackoverflow
Solution 17 - ReactjsGayan CharithView Answer on Stackoverflow