Javascript 防止节点';财政司司长';从插入'\r';排队休息
我对NodeJS不太在行,但我已经设法整合了一个基本的服务器脚本,从文件夹中获取标记文件,并编写了一个包含所有内容和frontmatter的JSON文件。问题是,生成的JSON对于某些换行符而不是其他换行符具有Javascript 防止节点';财政司司长';从插入'\r';排队休息,javascript,node.js,Javascript,Node.js,我对NodeJS不太在行,但我已经设法整合了一个基本的服务器脚本,从文件夹中获取标记文件,并编写了一个包含所有内容和frontmatter的JSON文件。问题是,生成的JSON对于某些换行符而不是其他换行符具有\r或\r\n\r,这导致了我前面的问题 例如: { "section": "Medical\r", } 不同于: { "section": "Medical", } 导致在我的文档中创建重复的“章节” 我
\r
或\r\n\r
,这导致了我前面的问题
例如:
{
"section": "Medical\r",
}
不同于:
{
"section": "Medical",
}
导致在我的文档中创建重复的“章节”
我试过:
- 检查额外的空白
- 手动删除JSON中的所有
,暂时修复了问题\r
- 节点v14.15.2
- MacOS 1.2.3
- VSCode 1.55.2
- CRA 4+
- nodemon 2.0.6运行服务器并观察更改
const path = require('path');
const fs = require('fs');
const dirPath = path.join(__dirname, '../library/');
let postList = [];
const getPosts = () => {
fs.readdir(dirPath, (err, files) => {
if (err) {
return console.log('Failed to list contents of directory: ' + err);
}
let fileList = [];
files.forEach((file, i) => {
let obj = {};
let post;
fs.readFile(`${dirPath}/${file}`, 'utf8', (err, contents) => {
const getMetadataIndices = (acc, elem, i) => {
if (/^---/.test(elem)) {
acc.push(i);
}
return acc;
};
const parseMetadata = ({ lines, metadataIndices }) => {
if (metadataIndices.length > 0) {
let metadata = lines.slice(
metadataIndices[0] + 1,
metadataIndices[1]
);
metadata.forEach((line) => {
obj[line.split(': ')[0]] = line.split(': ')[1];
});
return obj;
}
};
const parseContent = ({ lines, metadataIndices }) => {
if (metadataIndices.length > 0) {
lines = lines.slice(metadataIndices[1] + 1, lines.length);
}
return lines.join('\n');
};
const lines = contents.split('\n');
const metadataIndices = lines.reduce(getMetadataIndices, []);
const metadata = parseMetadata({ lines, metadataIndices });
const content = parseContent({ lines, metadataIndices });
// H2 headings
const h2 = /^## (.*$)/gim;
const headings = content.matchAll(h2);
var headingsArrays = [...headings].map((m) => m.slice(1));
var mergedHeadings = [].concat.apply([], headingsArrays);
post = {
name: metadata.title ? metadata.title : 'No title given',
updated: metadata.updated ? metadata.updated : 'No update given',
content: content ? content : 'No content given',
path: metadata.path ? metadata.path : '404',
section: metadata.section ? metadata.section : 'Misc',
headings: mergedHeadings ? mergedHeadings : []
};
postList.push(post);
fileList.push(i);
if (fileList.length === files.length) {
const sortedList = postList.sort((a, b) => {
return a.id < b.id ? 1 : -1;
});
let data = JSON.stringify(sortedList);
fs.writeFileSync('src/posts.json', data);
}
});
});
});
return;
};
getPosts();
const path=require('path');
常数fs=要求('fs');
const dirPath=path.join(_dirname,../library/);
让postList=[];
const getPosts=()=>{
fs.readdir(dirPath,(err,files)=>{
如果(错误){
返回console.log('未能列出目录的内容:'+错误);
}
让fileList=[];
files.forEach((文件,i)=>{
设obj={};
让邮政;
fs.readFile(`${dirPath}/${file}`、'utf8',(err,contents)=>{
const getMetadataIndexes=(acc、elem、i)=>{
如果(/^----/.测试(元素)){
acc.push(i);
}
返回acc;
};
const parseMetadata=({lines,metadataindex})=>{
如果(MetadataIndexes.length>0){
让metadata=lines.slice(
元数据索引[0]+1,
元数据索引[1]
);
metadata.forEach((行)=>{
obj[line.split(':')[0]=line.split(':')[1];
});
返回obj;
}
};
const parseContent=({lines,metadataindex})=>{
如果(MetadataIndexes.length>0){
lines=lines.slice(元数据索引[1]+1,lines.length);
}
返回行。连接('\n');
};
常量行=contents.split('\n');
const metadataindex=lines.reduce(getmetadataindex,[]);
const metadata=parseMetadata({lines,metadataindex});
const content=parseContent({lines,metadataindex});
//H2标题
常数h2=/^##(.*$)/gim;
常量标题=content.matchAll(h2);
var headingsArrays=[…headings].map((m)=>m.slice(1));
var mergedHeadings=[].concat.apply([],标题数组);
职位={
名称:metadata.title?metadata.title:“未提供标题”,
更新:metadata.updated?metadata.updated:“未提供更新”,
内容:内容?内容:“未提供内容”,
路径:metadata.path?metadata.path:'404',
节:metadata.section?metadata.section:'Misc',
标题:合并标题?合并标题:[]
};
postList.push(post);
文件列表推送(i);
if(fileList.length==files.length){
const sortedList=postList.sort((a,b)=>{
返回a.id
我非常感谢您提供的任何建议,可以阻止
\r
写入JSON。谢谢。以上@evolutionxbox的建议有效:
const path = require('path');
const fs = require('fs');
const dirPath = path.join(__dirname, '../library/');
let postList = [];
const getPosts = () => {
fs.readdir(dirPath, (err, files) => {
if (err) {
return console.log('Failed to list contents of directory: ' + err);
}
let fileList = [];
files.forEach((file, i) => {
let obj = {};
let post;
fs.readFile(`${dirPath}/${file}`, 'utf8', (err, contents) => {
const getMetadataIndices = (acc, elem, i) => {
if (/^---/.test(elem)) {
acc.push(i);
}
return acc;
};
const parseMetadata = ({ lines, metadataIndices }) => {
if (metadataIndices.length > 0) {
let metadata = lines
.slice(metadataIndices[0] + 1, metadataIndices[1])
.map((line) => line.replace(/\r$/, ''));
metadata.forEach((line) => {
obj[line.split(': ')[0]] = line.split(': ')[1];
});
return obj;
}
};
const parseContent = ({ lines, metadataIndices }) => {
if (metadataIndices.length > 0) {
lines = lines.slice(metadataIndices[1] + 1, lines.length);
}
return lines.join('\n');
};
const lines = contents
.split('\n')
.map((line) => line.replace(/\r$/, ''));
const metadataIndices = lines.reduce(getMetadataIndices, []);
const metadata = parseMetadata({ lines, metadataIndices });
const content = parseContent({ lines, metadataIndices });
// H2 headings
const h2 = /^## (.*$)/gim;
const headings = content.matchAll(h2);
var headingsArrays = [...headings].map((m) => m.slice(1));
var mergedHeadings = [].concat.apply([], headingsArrays);
post = {
name: metadata.title ? metadata.title : 'No title given',
updated: metadata.updated ? metadata.updated : 'No update given',
content: content ? content : 'No content given',
path: metadata.path ? metadata.path : '404',
section: metadata.section ? metadata.section : 'Misc',
headings: mergedHeadings ? mergedHeadings : []
};
postList.push(post);
fileList.push(i);
if (fileList.length === files.length) {
const sortedList = postList.sort((a, b) => {
return a.id < b.id ? 1 : -1;
});
let data = JSON.stringify(sortedList);
fs.writeFileSync('src/posts.json', data);
}
});
});
});
return;
};
getPosts();
const path=require('path');
常数fs=要求('fs');
const dirPath=path.join(_dirname,../library/);
让postList=[];
const getPosts=()=>{
fs.readdir(dirPath,(err,files)=>{
如果(错误){
返回console.log('未能列出目录的内容:'+错误);
}
让fileList=[];
files.forEach((文件,i)=>{
设obj={};
让邮政;
fs.readFile(`${dirPath}/${file}`、'utf8',(err,contents)=>{
const getMetadataIndexes=(acc、elem、i)=>{
如果(/^----/.测试(元素)){
acc.push(i);
}
返回acc;
};
const parseMetadata=({lines,metadataindex})=>{
如果(MetadataIndexes.length>0){
让元数据=行
.slice(元数据索引[0]+1,元数据索引[1])
.map((行)=>line.replace(/\r$/,“”));
metadata.forEach((行)=>{
obj[line.split(':')[0]=line.split(':')[1];
});
返回obj;
}
};
const parseContent=({lines,metadataindex})=>{
如果(MetadataIndexes.length>0){
lines=lines.slice(元数据索引[1]+1,lines.length);
}
返回行。连接('\n');
};
常量行=内容
.split(“\n”)
.map((行)=>line.replace(/\r$/,“”));
const metadataindex=lines.reduce(getmetadataindex,[]);
const metadata=parseMetadata({lines,metadataindex});
const content=parseContent({lines,metadataindex});
//H2标题
常数h2=/^##(.*$)/gim;
常量标题=content.matchAll(h2);
var headingsArrays=[…headings].map((m)=>m.slice(1));
var mergedHeadings=[].concat.apply([],标题数组);
职位={
名称:metadata.title?metadata.title:“未提供标题”,
更新:metadata.updated?metadata.updated:“未提供更新”,
内容:内容?内容:“未提供内容”,
路径:metadata.path?metadata.path:'404',
节:metadata.section?metadata.section:'Misc',
标题:合并标题?合并标题:[]
};
postList.push(post);
文件列表推送(i);
if(fileList.length==files.length){
const sortedList=postList.sort((a,b)=>{