Javascript 读取所有.md文件,将其转换为html并发送
我使用Javascript 读取所有.md文件,将其转换为html并发送,javascript,node.js,express,fs,readfile,Javascript,Node.js,Express,Fs,Readfile,我使用fs读取.md格式的文件,并希望将其转换为html文件 这是我目前的代码: fs = require('fs'); fs.readFile(__dirname + '/posts/react-v16.13.0.md', 'utf8', function (err, data) { if (err) { return console.log(err); } console.log(data); }); 该文件位于该文件夹中,并具有该名称 此函数将.md文件的内容放入控制
fs
读取.md格式的文件,并希望将其转换为html文件
这是我目前的代码:
fs = require('fs');
fs.readFile(__dirname + '/posts/react-v16.13.0.md', 'utf8', function (err, data) {
if (err) {
return console.log(err);
}
console.log(data);
});
该文件位于该文件夹中,并具有该名称
此函数将.md文件的内容放入控制台
为了将其转换为html,我添加了以下内容:
const showdown = require('showdown');
converter = new showdown.Converter();
...
fs = require('fs');
fs.readFile(__dirname + '/posts/react-v16.13.0.md', 'utf8', function (
err,
data
) {
if (err) {
return console.log(err);
}
text = data;
html = converter.makeHtml(text);
console.log(html);
});
它将文件作为html放在日志中,这很好
我的问题是,如果/posts/
文件夹中有多个文件,如何读取和发送这些文件
我想用POST方法将它们发送到前端
是否可以读取文件夹中的所有文件,转换并发送它们?我建议使用readdir和readFile的同步变体
const basePath = __dirname + '/posts/';
const htmls = [];
fs.readdirSync(basePath).forEach(file => {
const text = fs.readFileSync(basePath + file, 'utf8');
htmls.push({
file,
html: converter.makeHtml(text)
});
});
// upload htmls with axios/fetch/ ....
我建议使用readdir和readFile的同步变体
const basePath = __dirname + '/posts/';
const htmls = [];
fs.readdirSync(basePath).forEach(file => {
const text = fs.readFileSync(basePath + file, 'utf8');
htmls.push({
file,
html: converter.makeHtml(text)
});
});
// upload htmls with axios/fetch/ ....
const{readdir,readFile}=require('fs');
常量决战=需要(‘决战’);
const axios=require('axios');
让filehtmlist=[];
const converter=new shodown.converter();
readdir(`${uuuu dirname}/posts`,'utf8',(fsDirError,fileNameList)=>{
如果(!fsDirError){
fileNameList.forEach((文件名)=>{
readFile(`${uuuu dirname}/posts/${fileName}`、'utf8',(fsReadError,fileContent)=>{
如果(!fsReadError){
filehtmlist.push({
文件名:`${uuuu dirname}/posts/${fileName}`,
htmlContent:converter.makeHtml(fileContent)
});
}否则{
返回控制台错误(fsReadError);
}
});
});
}否则{
返回控制台错误(fsDirError);
}
});
/*我根据您的描述猜测这一部分,如果需要呈现内容,那么代码需要更改*/
让sendFrontEnd=async(数据)=>{
试一试{
const response=wait axios.post(`urlToSend`,data);
控制台日志(响应);
}捕获(错误){
控制台错误(error);
}
};
filehtmlist.forEach((项)=>{
sendFrontEnd(item.htmlContent);
});
const{readdir,readFile}=require('fs');
常量决战=需要(‘决战’);
const axios=require('axios');
让filehtmlist=[];
const converter=new shodown.converter();
readdir(`${uuuu dirname}/posts`,'utf8',(fsDirError,fileNameList)=>{
如果(!fsDirError){
fileNameList.forEach((文件名)=>{
readFile(`${uuuu dirname}/posts/${fileName}`、'utf8',(fsReadError,fileContent)=>{
如果(!fsReadError){
filehtmlist.push({
文件名:`${uuuu dirname}/posts/${fileName}`,
htmlContent:converter.makeHtml(fileContent)
});
}否则{
返回控制台错误(fsReadError);
}
});
});
}否则{
返回控制台错误(fsDirError);
}
});
/*我根据您的描述猜测这一部分,如果需要呈现内容,那么代码需要更改*/
让sendFrontEnd=async(数据)=>{
试一试{
const response=wait axios.post(`urlToSend`,data);
控制台日志(响应);
}捕获(错误){
控制台错误(error);
}
};
filehtmlist.forEach((项)=>{
sendFrontEnd(item.htmlContent);
});
从问题下方的评论线程中可以看出,您想要的东西可以实现以下功能:
- 将给定目录中的所有标记文件转换为HTML
- 在一个请求中发送它们
- 在单页应用程序中可用
模板元素中,该元素的内容可以在SPA脚本中克隆和操作
server.js
//对于“.promises”,我们可以使用“async/await”`
const fs=要求(“fs”).承诺;
// ...
const getHtmlByFilename=异步文件名=>{
const md=wait fs.readFile(
join(uuu dirname,“posts”,filename),
“utf-8”
);
返回converter.makeHtml(md);
};
app.get(“/”,异步(请求,响应)=>{
const filenames=wait fs.readdir(path.join(u dirname,“posts”);
//我们也可以用承诺
//并行映射文件名的步骤
const htmls=等待承诺。全部(
filenames.map(异步文件名=>{
const html=等待getHtmlByFilename(文件名);
返回{filename,html};
})
);
回复.发送(
htmlBoilerplate(
htmls
.地图(
({filename,html})=>
`${html}`
)
.join(“\n”),
“水疗”,
''
)
);
});
public/spa.js
[…document.queryselectoral(“模板”)].forEach(模板=>{
const clone=template.content.cloneNode(true);
const filename=template.id;
const details=document.createElement(“细节”);
const summary=document.createElement(“summary”);
summary.textContent=文件名;
详情.附件(摘要);
详细信息。追加子项(克隆);
document.querySelector(“.markdown body”).appendChild(详细信息);
});
glitch.me演示
|
局限性
- 转换是动态完成的。如果您的流量很大,您可能需要实现一些缓存,或者可能只是单独保存HTML版本,并在编辑相应的标记时触发对它们的更新
- 当前的代码可能不是XSS安全的-这假设帖子的内容/文件名是可信的,或者您在需要时进行了适当的卫生处理
从问题下方的评论线索中可以看出,您想要的东西具有以下功能:
- 将给定目录中的所有标记文件转换为HTML
- 在一个请求中发送它们
- 在单页应用程序中可用
这里有一种满足所有这些要求的方法。每个帖子的HTML都被插入到模板元素中,内容