2017-09-13 34 views
1

我目前正在構建一個js chrome擴展,爲此,我需要從一些站點中取消數據。Request.js與Browserify無法正常工作

因此,基於this SO question我發現我可以使用requestBrowserify

我安裝使用npm既創造了browserify.js片斷創建我bundle.js文件(因爲運行終端命令不工作權限的原因),所以我可以運行在客戶端Node jsrequire的,我的瀏覽器。

好了,我終於成功地創建bundle.js文件,並試圖在我的本地服務器上運行它,但它一直給我的CORS錯誤,不返回所需的響應:

提取API無法加載https://somesite/index.html。請求的資源上沒有「Access-Control-Allow-Origin」標題。因此'Origin'http://localhost:8080'不允許訪問。如果一個不透明的響應滿足您的需求,請將請求的模式設置爲'no-cors'以禁用CORS來獲取資源。

一個奇怪的事情是,如果我運行使用node的「分割」文件從終端直接:

$ node myFileWithRequires.js 

它按預期工作,返回的報廢數據。

我在做什麼錯?我如何在客戶端使用requestbrowserify來取消數據?

CODE:

myBrowserifySnippet.js

var browserify = require('browserify'); 
var b = browserify(); 
b.add('myrequest.js'); 
const fs = require('fs'); 
const writable = fs.createWriteStream('bundle.js'); 
b.bundle().pipe(writable); 

myFileWithRequires.js

var request = require('request'); 
request('http://www.google.com', function (error, response, body) { 
    console.log('error:', error); // Print the error if one occurred 
    console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received 
     console.log('body:', body); // Print the HTML for the Google homepage. 
     }); 
+0

你不想在客戶端使用'request'。 'request'太重(> 1MB)。相反'xhr'包使用'XMLHttpRequest'實現了請求API的一個子集。旨在與browserify一起使用。 –

+1

您的問題很可能與'somesite'中的CORS設置有關,而不是請求。 'somesite'不允許來自其他網站的請求,並且瀏覽器尊重這一點。 –

+0

@MehdiElFadil,那麼如何在沒有這個「請求」解決方案的情況下廢棄數據?你有什麼主意嗎? – Lioo

回答

2

默認情況下,XHR和fetch請求由CORS束縛,這意味着他們不可以 訪問其他域上的資源,除非這些域將「起源」(當前頁面的域)列入白名單。瀏覽器中的request使用XHR,所以它也受CORS的約束。

在Chrome擴展中,它有點不同 - 您可以配置您的擴展,使CORS不適用於某些域。請參閱chrome擴展文檔中的Requiesting cross-origin permissions

你需要一個permissions字段添加到您的擴展manifest.json

{ 
    "permissions": [ 
    "http://www.google.com/" 
    ] 
} 

如果你不知道事先哪個域,你會被刮,你可以使用通配符:

{ 
    "permissions": [ 
    "http://*/", 
    "https://*/" 
    ] 
} 
+0

我還沒有在擴展中測試,但我會嘗試並返回來告訴結果。謝謝 – Lioo

+0

這就是人,它的工作!謝謝一堆!真! – Lioo