2015-01-20 46 views
1

好的,我試圖在成功驗證get請求時使用node.js服務apk文件。爲此我使用形式的API調用:node.js:在獲取請求成功驗證後提供文件(特別是apk)

GET /apk/?username=user&token=a_token_goes_here 

注意實際的認證是通過對請求的首部發送的憑據進行(比如用戶名和密碼出現在那裏)。身份驗證成功,並且當我還驗證用戶的個性化令牌是否正確時,我現在應該將文件實際提供給客戶端。爲了簡單起見處理程序的代碼的關鍵部分是這樣的:

Peer.find({"username": request.credentials.peer.username}).exec(function (dbError, results) { 
    if (dbError) { 
     // handle error 
    } 

    if (results[0]._id.toString() === request.query.token) { 
     var absolutePath = THE_ACTUAL_PATH_TO_THE_APK_NOT_UNDER_PUBLIC; 
     var stat = fs.statSync(absolutePath); 
     response.writeHead(200, { 
      'Content-Type': 'application/vnd.android.package-archive', 
      'Content-Length': stat.size 
     }); 
     var readStream = fs.createReadStream(absolutePath); 
     readStream.pipe(response); 
     return callback (null); 
    } else { 
     // error handling ... 
    } 
} 

我的錯誤碼200返回服務器控制檯上看到。但是,在客戶端,感覺就像ajax調用永不結束。這是因爲我在呼叫之前關閉了ajax呼叫的按鈕,並且我將在呼叫結束後再次激活按鈕。此外,我在瀏覽器控制檯上打印了未打印的聲明。其實一些陳述是印刷的,但也許2分鐘後,然後再一次,而不是所有。出於測試的目的,我與內容

Here is your APK! 

,我作爲一個APK文本文件。有人能指出我做錯了什麼嗎?很可能我應該使用不同的功能來提供文件?我們如何強制客戶保存我們最終想要從上面的URL訪問的文件?

這裏有一個次要問題(很可能是天真的):如果試圖下載文件的客戶端使用非常糟糕的連接,會發生什麼情況?這是否意味着node.js上的解決方案代碼阻止了所有其他傳入呼叫,直到低帶寬連接的人完成他/她下載的apk爲止? (我希望不是,它以某種方式返回塊或東西)

加入Ajax調用

$.ajax({ 
    type: "GET", 
    url: theURL, 
    accepts: "application/vnd.android.package-archive", 
    beforeSend : function(xhr) { 
     xhr.withCredentials = true; 
     xhr.setRequestHeader("Authorization", "Basic " + mem.apk.username + ":" + mem.apk.password); 
     xhr.setRequestHeader("APP_KEY", mem.component.appKey); 
     xhr.setRequestHeader("APP_SECRET", mem.component.appSecret); 
    }, 
    async: true, 
    contentType: "application/vnd.android.package-archive", 
    success: function(data, textStatus, jqXHR) { 
     var response = data; 
     console.log ("Data follows:"); 
     console.log (data); 
     console.log ("Data ended"); 
    }, 
    error: function (data, textStatus, errorThrown) { 
     var response = JSON.parse(data.responseText); 
     console.log (JSON.stringify(response)); 
     alert(response.message); 
    }, 
    crossDomain: true, 
    username: mem.apk.username, 
    password: mem.apk.password 
}).done(function() {}).fail(function() {}).always(function() { 
    $('#apkButton').prop("disabled",false); 
}); 
+0

要回答你關於節點阻塞所有其他連接的問題:不。節點異步和非阻塞地執行I/O。因此,如果用戶處於慢速連接狀態,則其他請求將在此期間正常工作。 – mscdex 2015-01-20 23:47:06

+0

謝謝! – MightyMouse 2015-01-20 23:48:09

回答

1

Express提供的功能來下載文件

var apkFile = THE_ACTUAL_PATH_TO_THE_APK_NOT_UNDER_PUBLIC 
if(!fs.existsSync(apkFile)) 
    return res.status(404).send('Sorry no APKs here'); 

response.download(apkFile); 

文檔下載的( )在這裏http://expressjs.com/4x/api.html#res.download。如果您正在發送的文件名的擴展名是'.apk',Express表示正確的標題。

相關問題