我發現這個"Rendering PDFs with React components"關於在流星服務器端創建PDF文件,然後將它們發送回客戶端的themeteorchef教程。我沒有真的需要爲PDF文件,但DOCX文件,而不是與想,也許我可以officegen爲什麼fs.readFileSync不會在承諾內返回任何內容?
創建的docx文件時,請按照類似的方法我創建的產生從客戶方輸入一個的docx文件非常類似的服務器端模塊然後嘗試將它們轉換爲base64字符串,然後應該將其發送到客戶端。但是,base64字符串永遠不會被創建。
這裏的模塊:
let myModule;
const getBase64String = (loc) => {
try {
const file = fs.readFileSync(loc);
return new Buffer(file).toString('base64');
} catch (exception) {
myModule.reject(exception);
}
}
const generateBase64Docx = (path, fileName) => {
try {
myModule.resolve({fileName, base64: getBase64String(path+fileName)});
fs.unlink(loc);
} catch (exception) {
myModule.reject(exception);
}
}
const formatComponentAsDocx = (props, fileName) => {
try {
var docxFile = officegen({
'type': 'docx',
'orientation': 'portrait',
'title': props.title,
});
var pObj = docxFile.createP();
pObj.addText(props.body);
var path = './';
output = fs.createWriteStream(path+fileName);
docxFile.generate(output);
return path;
} catch (exception) {
myModule.reject(exception);
}
}
const handler = ({props, fileName}, promise) => {
myModule = promise;
const path = formatComponentAsDocx(props, fileName);
if (path) {
generateBase64Docx(path, fileName);
}
}
export const generateComponentAsDocx = (options) => {
return new Promise((resolve, reject) => {
return handler(options, { resolve, reject });
});
};
這裏的問題是fs.readFileSync一部分。它總是返回空緩衝區,這就是爲什麼文件永遠不會轉換爲base64字符串,也永遠不會發送回客戶端。爲什麼?文件本身始終在服務器上創建並始終可以找到。
如果我改變const file = fs.readFileSync(loc);
部分例如本
fs.readFile(loc, (err, data) => {
if(err) myModule.reject(err);
console.log(JSON.stringify(data));
}
我可以看到數據一些數據,但還不足以對整個文件。
我在這裏做錯了什麼?我錯過了什麼嗎?
從Google Cloud中刪除文件並試圖呈現被動呈現給客戶端時,我遇到了此問題。文件被正確刪除,但它們的句柄不會被反應性地呈現。刷新後它們纔會呈現。所以這兩種情況下的根本問題是一樣的。 – zaplec
我打算在黑暗中提出一個關於'fs.unlink(loc);'是否可以在錯誤的時間踢入的暗殺機會,但後來認識到'loc'沒有在那個時候定義... Next :是'formatComponentAsDocx()'同步調用?我不會猜到,但如果它不_,你會不會調用'generateBase64Docx()'來儘快寫出它的輸出? – TripeHound