好的,我試圖在成功驗證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);
});
要回答你關於節點阻塞所有其他連接的問題:不。節點異步和非阻塞地執行I/O。因此,如果用戶處於慢速連接狀態,則其他請求將在此期間正常工作。 – mscdex 2015-01-20 23:47:06
謝謝! – MightyMouse 2015-01-20 23:48:09