1

APIからPDFをフェッチし、そのPDFを提供するノードサービスがあります。

APIをカールまたは直接開くと、正しいpdfが表示されます。

しかし、Nodeアプリから提供すると、空のpdfが表示されます。

これが、PDFレンダリングを行う私のコードのセクションです。

} else if (options.type === 'pdf') {
  res.writeHead(200, {'content-type' : 'application/pdf', 'content-disposition': 'attachment; filename=invoice.pdf'});
  res.end(data.invoice);

私はそれが正しいものであることを知るためにdata.invoiceをconsole.logしました。

typeof(data.invoice)は文字列を提供します。しかし、res.end(new Buffer(data.invoice));も試しました。どちらも機能しませんでした。

これがデータをフェッチする私のコードのセクションです

var http_options = {
  method : options.method
, host : Config.API.host
, path : options.path
, port : Config.API.port
, headers : options.headers
};

var req = http.request(http_options, function (response) {
  var raw_response = "";

  response.on('data', function (response_data) {
    raw_response += response_data.toString();
  });

  response.on('end', function () {
    if (response.statusCode !== 200) {
      cb(raw_response);
    } else {
      cb(false, raw_response);
    }
  });
});

req.setTimeout(timeout, function () {
  req.abort();
  cb("API connection timed out");
});

req.on('error', function (error) {
  cb("API error while requesting for " + options.path + '\n' + error + '\n' + "http   options: " + JSON.stringify(http_options)
});

req.end();
4

2 に答える 2

2

toString()PDFを受信したときのと連結によってPDFが破損している可能性があります。ファイルに書き込んraw_responseで(これは1回限りのテストなので使用できますwriteFileSync())、curlで取得した同じPDFとバイトごとの比較を行ってみてください。

文字列変換のプロセスで破損している場合は、送信する前に文字列をバッファに戻そうとしても効果がないことに注意してください。最初から最後まで、すべてをバッファとして保持する必要があります。

于 2012-08-31T02:26:19.143 に答える
1

転送中にこのデータを変更したり読み取ったりするつもりはないので、パイプ関数を使用して、着信するすべてのデータをresponseアウトからにパイプすることをお勧めしreqます。この質問には良いサンプルがありますが、ここに抜粋があります。

req.on('response', function (proxy_response) {
    proxy_response.pipe(response);
    response.writeHead(proxy_response.statusCode, proxy_response.headers);
});

バッファからの応答から入ってくるチャンクを他のものに変換する理由はないことに注意してください。最大の効率を得るためにそれらを蓄積するのではなく、変更されていないバッファとして書き込み、ストリーミングします(これはパイプが行うことです)。およびnode.jsストリーミングヒップスターポイント)。

于 2012-08-31T05:09:15.537 に答える