Sapper アプリケーションの作成中に問題に遭遇したので、それにある程度精通していると、おそらく回答に役立つでしょう...問題は (express のように) polka である可能性もありますが...よくわかりません。それが私がここにいる理由です:-)
これは、私が遭遇した問題の簡単な例であり、その理由を理解しようとしています. これは、JSON を返す Sapper サーバー ルートのコードです。
export function get(req, res) {
let arr = [];
let count = 0;
let data = {"somekey": "someval"}
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(data));
console.log('response sent');
while (count++ < 1000000000) {
arr.push(Math.random());
arr.pop();
}
console.log(arr[arr.length - 1]);
}
このコードには次のことが期待されます。
- 文字列化された JSON をクライアントに送信する
- サーバー上のコンソールログ「応答が送信されました」
- while ループが完了すると、コンソールはサーバー上の配列の最後の要素をログに記録します。
代わりに、サーバーに「送信された応答」をコンソール ログに記録しますが、クライアントはハングし、while ループが完了するまでサーバーは応答を送信しません。
res.end は res.end に到達したらすぐに応答を送信する必要があると考えていましたが、代わりに先に進んでいるように見え、「get」関数が完了すると応答のみが返されます。
何故ですか?それは Sapper、Polka、または res.end の仕組みに関する私自身の誤解ですか?