Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.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 防止节点';财政司司长';从插入'\r';排队休息_Javascript_Node.js - Fatal编程技术网

Javascript 防止节点';财政司司长';从插入'\r';排队休息

Javascript 防止节点';财政司司长';从插入'\r';排队休息,javascript,node.js,Javascript,Node.js,我对NodeJS不太在行,但我已经设法整合了一个基本的服务器脚本,从文件夹中获取标记文件,并编写了一个包含所有内容和frontmatter的JSON文件。问题是,生成的JSON对于某些换行符而不是其他换行符具有\r或\r\n\r,这导致了我前面的问题 例如: { "section": "Medical\r", } 不同于: { "section": "Medical", } 导致在我的文档中创建重复的“章节” 我

我对NodeJS不太在行,但我已经设法整合了一个基本的服务器脚本,从文件夹中获取标记文件,并编写了一个包含所有内容和frontmatter的JSON文件。问题是,生成的JSON对于某些换行符而不是其他换行符具有
\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)=>{