私が取り組んでいるクライアント側の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
。
私のロジックが正常に見えることをMDNで確認しました。次に、ブラウザーの JavaScript コンソールでテストして、ロジックが正常に機能していることを確認しました。
私はついにこの投稿に出会い、 node.jsベースのNW.jsフレームワークで実行されている実装に問題があるに違いないことに気付きました。node.jsに XMLHttpRequest の実装がネイティブに含まれていないという事実をまったく考慮していなかったので、これはNW.jsのCEFによって提供されていると想定しています。
NW.jsアプリケーションではなく、ブラウザーでinstanceof Blob
返さfalse
れることを確認しました。true
この実装は、移植可能であり、ブラウザーでの健全性チェックが簡単であるため、ブラウザー テクノロジに基づいて維持したかったのです。NW.js github で他の問題に気付いたので、フレームワークで使用することを意図していると思います。
この問題を処理するnode.jsの標準的な方法にフォールバックできることはわかっていますが、この問題を解決する方法があるかどうか知りたいです。
また、完全なノード ベースのアプリケーション変換に関するこの提案にも気付きました。
他の提案はありますか?