好吧,我想服务如何使用Node.js在一个GET请求的成功验证的apk文件。 为此我使用形式的API调用:
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。 有人能指出我什么,我做错了什么? 最有可能的,我应该使用不同的功能提供服务的文件? 我们如何能够强制客户端保存,我们最终希望从像上面的一个网址提供的文件吗?
在这里,有一个次要的问题(很可能是幼稚):如果正在试图下载该文件的客户端使用一个特定非常蹩脚的连接发生什么呢? 这是否意味着在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);
});