2016-08-24 40 views
0

我正在使用加載內置https軟件包的node.js腳本。當使用它,我得到錯誤:如何在僅使用node.js的API調用中禁用'withCredentials'(https package)

XMLHttpRequest cannot load [constructed-api-url]. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost:3000' is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.

我如何使用Node.js 4.4.3,其https api docs並沒有真正提到關於withCredentials什麼。

正在使用的腳本是this one

是否有無論如何使用node.js https設置xhr調用withCredentials爲false?

我期待到這個jQuery AJAX調用(只專注於XHR場)的東西類似:

$.ajax({ 
      type: 'POST', async:true, 
      url: 'https://someapp.constructed.url/token', 
      dataType: "json", 
      contentType: 'application/x-www-form-urlencoded; charset=utf-8', 
      xhrFields: { 
       withCredentials: true 
      }, 
      headers: { 
       'Authorization': 'Basic ' + appInfo      
      },    
      success: function (result) { 
       var token = result.access_token; 
       //…     
      }, 
      error: function (req, status, error) { 
       if (typeof(req) != 'undefined') { 
        var msg = status || req.responseJSON.error; 
        //… 
       }     
      } 
    }); 

還有另一個非常類似的例子,但這是關係到請求包,我不不想包含在依賴中。除此之外,我用過的腳本已經在使用https。

+1

這是瀏覽器的錯誤,它有無關節點。 –

+0

@AlexeyTen:當然不是節點的錯,但是從jquery ajax示例中可以看出,可以從請求代碼中設置特定的xhr標誌。這可以通過node.js的https模塊完成嗎? – j4v1

+0

節點不關心這個標誌。您應該在瀏覽器中執行的JS代碼中查找它。 –

回答

0

所以答案是那裏所有的時間,畢竟:

了一些研究之後,發現該節點的HTTPS包使用幾乎相同的選項,如HTTP,包括withCredentials選項(在節點的HTTP/HTTPS沒有記錄,但是xhr文檔的一部分)。這是沿着withCredentials選項在選項對象中包含url選項的問題,然後將options對象作爲參數傳遞給https.get

而構建的代碼會或多或少如下(重點options變量):

var options = { 
    url: 'https://my.domain.com/api/endpoint', 
    withCredentials: false 
} 
var querystring = '?key=' + [_my_api_key]; 
var param1 = '&' + [paramKey] + '=' + [paramValue]; 

var datos; 

options.url += querystring; 
options.url += param1; 

https.get(options, function (res) { 
    res.on('data', function (data) { 
    datos += data; 
    }); 

    res.on('end', function() {  
    try { 
     var data = JSON.parse(datos); 
    } catch (e) { 
     console.error('Unable to parse response as JSON', e); 
    } 
    }); 
}).on('error', function (e) { 
    console.error('An error occurred with the request:', e.message); 
    callback(e.message); 
});