2
fetch('http://localhost:9000/api/app/contact', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ email: this.state.email, contactNumber: this.state.phone, enquiry: this.state.msg }) }) .then(function(res) { return res.json() }) .then(function(data) { alert('We will contact you shortly') }); 

When I render above coding, I've encountered following error:

Failed to load http://localhost:9000/api/app/contact: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

But when I tried with postman, it's successfully working. Please help me, is there any code missing in my fetch api.

Following is postman POST request and code.

enter image description here

following code is Post request from Postman.

var data = JSON.stringify({ "email": "[email protected]", "contactNumber": "0123456789", "enquiry": "Testing" }); var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.addEventListener("readystatechange", function () { if (this.readyState === 4) { console.log(this.responseText); } }); xhr.open("POST", "http://localhost:9000/api/app/contact"); xhr.setRequestHeader("content-type", "application/json"); xhr.setRequestHeader("cache-control", "no-cache"); xhr.setRequestHeader("postman-token", "d5e08b69-5f0f-8193-e021-e2c3b1bfe1a3"); xhr.send(data); 

In NodeJS server side, I've already CORS in backend.

var express = require('express'), controller = require('./app.controller'), router = express.Router(), cors = require('cors'); var issue2options = { origin: true, methods: ['POST'], credentials: true, maxAge: 3600 }; router.post('/contact', cors(issue2options), controller.sendContactForm); module.exports = router; 
3
  • CORS support needs to be added/enabled on the server running on http://localhost:9000. See enable-cors.org/server.html and developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS Commented Sep 8, 2017 at 3:00
  • 1
    @sideshowbarker I've edited my answer and configured CORS in node. Commented Sep 8, 2017 at 3:06
  • Am I reading in your code correctly that on the node server you only have CORS enabled for the /contact route but that your frontend code is making a request to /api/app/contact? On the node backend do those somehow end up resolving to the same route? To isolate/troubleshoot the problme, Have you tried testing with temporarily enabling CORS for all routes instead of just that one route? Commented Sep 8, 2017 at 3:11

2 Answers 2

4

You need to add explicit OPTIONS handling for CORS preflights that browsers send on their own:

app.options('/contact', cors(issue2options)); // enable preflight OPTIONS router.post('/contact', cors(issue2options), controller.sendContactForm); 

See https://www.npmjs.com/package/cors#enabling-cors-pre-flight

Sign up to request clarification or add additional context in comments.

Comments

1

Postman is not the same as the browser.

To fix that, you need the server in http://localhost:9000/api/app/contact to return in its headers the CORS header, like this for example Access-Control-Allow-Origin: *

Read here for detailed CORS reference https://enable-cors.org/server.html

1 Comment

I've edited my answer and CORS is already configured in NodeJS.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.