2017-02-19 5 views
2

ИТАК У меня есть Angular2 приложения, работающее на http://localhost:4200/, внутри этого приложения я пытаюсь вызвать функцию, расположенную в отдельном node.js применения в настоящее время работает на http://localhost:3000/Angular2 node.js вызова приложений функционирует

Моего звонка от Angular2 применение:

deletePhoto(photoId: string) { 

    var options = new RequestOptions({ 
     headers: new Headers({ 
      'Accept': 'application/json', 
      'Access-Control-Allow-Origin': 'http://localhost:4200' 
     }) 
    }); 

    let url = `http://localhost:3000/delete?photoId=${photoId}`; 

    this.http.post(url, options).subscribe(response => { 
     let user = response.json() 
     console.log(user); 
    }, 
     err => { 
      console.log('Unable to call delete photo', err); 
     }); 

} 

И это моя node.js функция:

var express = require('express') 

var app = express(); 

app.post('/delete', function (req, res) { 

    req.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200'); 
    res.setHeader('Access-Control-Request-Method', '*'); 
    res.setHeader('Access-Control-Allow-Methods', 'POST'); 
    res.setHeader('Access-Control-Allow-Headers', '*'); 

    var photoId = req.query['photoId']; 
    //var userId = req.query['userId']; 
    res.json({ "photoId": photoId, "test": "Testing node server" }) 
}) 

Однако ошибка я получаю в браузере:

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:4200 ' is therefore not allowed access.

Теперь после того, как прибегая к помощи этой ошибки, я прочитал мне нужно, чтобы установить заголовок на запрошенный ресурс, поэтому я не добавил req.setHeader на моем node метод, но все-таки с не avail, я также установил его в своем приложении Angular2, чтобы узнать, что это значит, но, к сожалению, такой же результат.

Я прочитал cors, но, к сожалению, я все еще смущен этим.

Это первый раз, когда я пытался сконфигурировать Angular2 и Node.js, поэтому, пожалуйста, со мной, любые предложения/помощь, конечно, будут высоко оценены.

+0

Если вы используете angular-cli, здесь есть настройка прокси-сервера, которую они описывают здесь: https://www.npmjs.com/package/angular-cli#proxy-to-backend – Dylan

+0

Если настройка прокси-сервера does'nt помогите вам в обходном пути, вы можете временно отключить эту функцию браузера с помощью этого хром-плагина. https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=ru-RU – Rajiv

+0

Итак, я добавил прокси, настроил начальную настройку в файле package.json, но проблема все еще остается. Если я отключил функции браузера, тогда, когда я в конечном итоге перейду к производству с этим, и я снова включу функции, тогда проблема вернется, не так ли? –

ответ

0

Вы также должны добавить код для обработки параметров запроса, что браузеры отправить для CORS preflights:

app.options('/delete', function(req, res) { 
    res.send(200); 
}); 

Это добавление только вызывает ваше приложение Node отправить 200 ответ без тела со всеми необходимыми Access-Control-* заголовки ответа.

+0

Спасибо за информацию, я просто добавил скрипт, который вы предоставили узловому приложению, поэтому у меня есть app.options ('/ delete' и app.post ('/ delete', но все же проблема остается. –

+0

ближе, я не получаю ошибку "TypeError: req.setHeader не является функцией, которая возвращается после ее вызова –

+0

Вам нужно обязательно поместить этот код и фрагмент из вопроса в свой код приложения до любого другого Express Маршрутизация вашего приложения - как можно ближе к вершине, как вы можете, в основном. – sideshowbarker

Смежные вопросы