我已经为我正在处理的客户端NW.js应用程序编写了一个 REST 实用程序方法。我从堆栈溢出中找到的示例扩展了实现,尽管我现在似乎找不到它。
这是逻辑:
_makeRequest = function(method, url, params, headers, responseType) {
params = params || null;
headers = headers || null;
responseType = responseType || null;
return new Promise(function (resolve, reject) {
// We'll need to stringify if we've been given an object
// If we have a string, ArrayBuffer, Blob, or File, this is skipped.
if (params && (typeof params === 'object') && !(
params instanceof ArrayBuffer ||
params instanceof Blob ||
params instanceof File
)) {
params = Object.keys(params).map(function (key) {
return encodeURIComponent(key) + '=' + encodeURIComponent( _resolveDatasetNamespace( params[key] ) );
}).join('&');
}
var xhr = new XMLHttpRequest();
xhr.responseType = (responseType) ? responseType : "";
xhr.open(method, (method === "GET" && params) ? url + "?" + params : url);
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
if (headers) {
Object.keys(headers).forEach(function (key) {
xhr.setRequestHeader(key, headers[key]);
});
}
xhr.send(params);
});
};
总体而言,该方法效果很好,但我注意到onerror
当我尝试发送Blob
数据时,我会触发 oh so unhelpful 回调。
我用MDN验证了我的逻辑看起来很理智。然后我在浏览器 javascript 控制台中进行了测试,发现逻辑在那里工作得很好。
我终于看到了这篇文章,意识到在基于node.js的NW.js框架中运行的实现肯定是有问题的。我完全没有考虑到node.js本身并不包含 XMLHttpRequest 的实现这一事实,所以我假设这是由CEF在NW.js中提供的。
我验证了它在我的NW.js应用程序中但在浏览器中instanceof Blob
返回。false
true
我真的很想保留这个基于浏览器技术的实现,因为它既可移植又易于在浏览器中进行健全性检查。我注意到NW.js github上的其他问题,所以我认为它打算与框架一起使用。
我知道我可以回退到处理这个问题的node.js标准方式,但我很好奇是否有办法解决这个问题。
我还注意到这个关于完全基于节点的应用程序转换的建议。
还有其他建议吗?