我发现这个"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