2012-08-31 58 views
1

我有一個節點服務,它從API中提取pdf並提供該pdf。Node.js:服務動態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); 

我已經console.log'ed data.invoice知道這是正確的東西。

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(); 
+0

您是否嘗試過在Content-Type上使用大寫字母?因爲你寫了小寫「c」和「t」 –

+0

剛試過,沒有工作 – Max

回答

2

這很可能是toString(),當您收到的PDF級聯被破壞它的部分。嘗試將raw_response寫入文件(您可以使用writeFileSync(),因爲這只是一次性測試),並使用curl檢索的相同PDF進行逐字節比較。

請注意,如果字符串轉換過程已損壞它,試圖在發送它之前將其轉換回緩衝區將無濟於事。你必須從頭到尾保留整個事物作爲緩衝區。

+0

謝謝!將嘗試明天 – Max

+0

有沒有辦法連接緩衝區而不寫入文件? – Max

+0

我正在嘗試Buffer.concat,但現在我得到「損壞」pdf,當我試圖打開它下載後,有什麼想法? – Max

1

由於您不打算在傳輸中修改或讀取此數據,因此我建議您只使用pipe函數將來自response的所有數據輸出到reqthis question has a good sample,但這裏是一個摘錄。

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

注意,有沒有理由從緩衝區別的響應進來的塊轉換,只寫他們通過爲未修改的緩衝區,以及串流播放(這是管會爲你做什麼),而不是積累它們以獲得最大效率(和node.js流式時髦點)。

+0

雖然我很想這樣做;需要一些工作才能適應現有的架構......也許我會在稍後成爲瓶頸時嘗試 – Max