Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 读取所有.md文件,将其转换为html并发送_Javascript_Node.js_Express_Fs_Readfile - Fatal编程技术网

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
  • 在一个请求中发送它们
  • 在单页应用程序中可用
这里有一种满足所有这些要求的方法。每个帖子的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都被插入到
模板
元素中,内容