0

我已经为我正在处理的客户端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.jsNW.js框架中运行的实现肯定是有问题的。我完全没有考虑到node.js本身并不包含 XMLHttpRequest 的实现这一事实,所以我假设这是由CEFNW.js中提供的。

我验证了它在我的NW.js应用程序中但在浏览器中instanceof Blob返回。falsetrue

我真的很想保留这个基于浏览器技术的实现,因为它既可移植又易于在浏览器中进行健全性检查。我注意到NW.js github上的其他问题,所以我认为它打算与框架一起使用。

我知道我可以回退到处理这个问题的node.js标准方式,但我很好奇是否有办法解决这个问题。

我还注意到这个关于完全基于节点的应用程序转换的建议。

还有其他建议吗?

4

0 回答 0