2017-06-20 23 views
1

私は自分のウェブサイトにある支払いごとに請求書を生成するAPIを持っています。反対側に、私はクライアントを管理するサーバーがあります。私はクライアントがそれを求めるときにpdfを取得する必要があります。ノード(Express) - APIを使用してエクスプレス付きのpdfを送信

httpコールを管理するためにnode/expressとaxiosを使用しています。

私は次のコードで、APIからPDFファイルを送信するために管理:

function retrieveOneInvoice(req, res, next) { 
    Order 
     .findOne({_id: req.params.id, user: req.user.id}) 
     .exec((err, order) => { 
      if(err) { 

      } else if (!order) { 
       res.status(404).json({success: false, message: 'Order not found!'}); 
      } else { 
       const filename = order.invoice.path; 
       let filepath = path.join(__dirname, '../../../invoices' ,filename); 

       fs.readFile(filepath, function (err, data){ 
        res.contentType("application/pdf"); 
        res.end(data, 'binary'); 
       }); 
      } 
     }); 
} 

その部分の細かい作業を、私はPDFファイルを取得して保存することができます。私は、データを印刷する場合はさらに、私は次のようになり、バッファました:私のクライアントで<Buffer 25 50 44 46 2d 31 2e 34 0a 31 20 30 20 6f 62 6a 0a 3c 3c 0a 2f 54 69 74 6c 65 20 28 fe ff 29 0a 2f 43 72 65 61 74 6f 72 20 28 fe ff 29 0a 2f 50 72 6f ... >

を、私はaxiosを使用してデータをフェッチ:

function retrieveInvoice(Config) { 
    return function(orderId, done) { 
     axios({ 
      url: `${Config.apiUrl}/invoices/${orderId}`, 
      method: 'get' 
     }).then(
      (res) => { return done(null, res.data) }, 
      (err) => { return done(err) } 
     ) 
    } 
} 

そして最後に、私はそれをクライアントに送信しよう前の関数を呼び出すことによって:

Api.retrieveInvoice(orderId, (err, data) => { 
     if(err) { 

     } else { 
      res.contentType("application/pdf"); 
      res.end(new Buffer(data, 'binary'), 'binary'); 
     } 
    }); 

それは私の問題がある場所です。私はいつも空白のページを受け取ります。私はバッファの有無にかかわらず、このように試しました。

res.contentType("application/pdf"); 
res.end(data, 'binary'); 

「バイナリ」パラメータなし。私がAPIと私のクライアントの両方でデータを記録すると、まったく同じバッファとバイナリが得られます。私はクライアントにそれらを送っているので、私はちょうど私のミスがどこになるのか理解できません。

私はあなたに私を助けるために十分な情報を逃したと私は何かが不足している私は潜在的なヘルパーを助けることができるすべてを追加します。

はあなたの助けをいただき、ありがとうございます。

答えて

1

これを試しましたか?

あなたaxios要求:

axios({ 
    url: `${Config.apiUrl}/invoices/${orderId}`, 
    method: 'get', 
    responseType: 'stream' 
}).then(
    ... 
) 

とコールバック:

Api.retrieveInvoice(orderId, (err, data) => { 
    if (err) { 
     // handle error 
    } else { 
     res.contentType("application/pdf"); 
     data.pipe(res); 
    } 
}); 

You can find documentation on this here.

デフォルトresponseTypeので、これは問題を解決しなければならない変更、'json'です。

+1

ありがとう、私は 'data.pipe(res)'を先に試しましたが、私はレスポンスタイプのものを見ませんでした。 –

関連する問題