【问题标题】:A Simple Way To Edit And Delete files in a directory in Node.js?在 Node.js 中编辑和删除目录中文件的简单方法?
【发布时间】:2015-03-04 05:34:20
【问题描述】:

您好,我正在使用 express.js 创建一个简单的博客,使用 data.json 文件创建/更新/删除基于 id 的帖子。 每次我这样做时,我都会使用 fs.writeFile 来创建和更新 Markdown 帖子,使用 json 数组中的 slug 数据。 因此,当我创建一个名为 First Post 的帖子时,我会在我的 /path 文件夹中获得一个 first-post.md 文件。 问题:每次我更新文件并使用 fs.writeFile 时,我都会创建一个新文件路径而不删除旧文件路径?

例子:

更新json数组上的名称数据:

第一次发帖第一次发布更新 我得到一个降价文件 first-post-update.md。但旧的 first-post.md 文件仍然存在。

是否可以删除在 data.json 文件中没有到每个 slug 数据的相应链接的目录路径上的每个 markdown 文件?

类似这样的:

function deleteFiles(files, callback){

 files.forEach(function(filepath){

//Filter every item.id on data.json and get the slug params.

    fs.unlink(filepath, function(err) {

//If any markdown file don´t have a corresponding link to each slug data delete them.

    });

}

data.json 示例:

{
  "posts": [
    {
      "name": "First Post",
      "desc": "Some description",
      "slug": "first-post",
      "id": "07cbc3854-7fa7-4451-883c-a9c8c87143ef"
    }
  ]
}

一些创建和更新帖子的示例代码:

exports.save = function (req, res) {

var slugTitle = slug(req.body.name).toLowerCase().split('.').join("");

  var description = req.body.desc;

 db.add({name:req.body.name, desc:req.body.desc, slug: slugTitle});

fs.writeFile("path/"+slugTitle+".md", description, function(err) {
            if(err) {
              console.log(err);
            } else {
              console.log("The new post was created on path/"+slugTitle+".md");
            }
          });

    res.redirect('/post');
};


exports.update = function (req, res) {

var slugTitle = slug(req.body.name).toLowerCase().split('.').join("");

var description = req.body.desc;

db.update({id: req.body.id, name: req.body.name, desc: req.body.desc,slug: slugTitle});

   fs.writeFile("path/"+slugTitle+".md", description, function(err) {
            if(err) {
              console.log(err);
            } else {
              console.log("The new post was updated on path/"+slugTitle+".md");
            }
          });

    res.redirect('/post');
};

【问题讨论】:

    标签: javascript json node.js express


    【解决方案1】:

    您是否考虑过在更新过程中删除旧的 Markdown 文件?您可以在更新之前从数据库中的文档中检索 slugTitle,然后删除该文件。我在下面概述了一个示例,您可以将此作为另一个功能或将其直接集成到您的更新功能中。您需要考虑一下在没有太多分层回调的情况下,什么最适合您的代码。

    请注意,我使用的是 Mongoose 的 findById,但您可以将这个概念应用到您正在使用的任何系统中。

    db.findById(req.body.id, 'slug', function(err, slugTitle) {
      if(err) {
        console.log(err);
      }
      fs.unlink("path/"+slugTitle+".md", function(err) {
        if(err) {
          console.log(err);
        } else {
          console.log("Deleted the old markdown file: " + slugTitle +".md");
        }
      });
    });
    

    【讨论】:

    • 您好 jhildreth。谢谢您的回答,这是有道理的,但是将其应用于代码会给我一个奇怪的错误。 { [Error: ENOENT, open 'c:\my\path\my-updated-post.md'] errno: -4058, code: 'ENOENT', path: 'c:\\my\\path\\my-updated-post.md' }.
    • 我正在以这种方式应用代码:exports.update = function (req, res) { var slugTitle = slug(req.body.name).toLowerCase().split('.').join(""); var description = req.body.desc; db.update({id: req.body.id, name: req.body.name, desc: req.body.desc,slug: slugTitle}); db.getById(req.body.id, 'slug', function(err, slugTitle) { if(err) { console.log(err); } fs.unlink("path/"+slugTitle+".md", function(err) { if(err) { console.log(err); } else { console.log("Deleted the old markdown file: " + slugTitle +".md"); } }); }); res.redirect('/post'); };
    • 嗨,保罗,不客气!看起来您正在更新数据库中的 slug 标题,然后再确定要删除的文件,对吗?在使用新的 slug 标题更新数据库之前,您需要从数据库中检索旧的 slug 标题(它将告诉您要取消链接的正确文件)。
    【解决方案2】:

    您可能想考虑使用 MongoDB 或 SQL 等数据库系统来代替。使用数据库通常比自己编写所有这些东西更容易。可以这么说,无需重新发明轮子。看起来您已经在使用一个来存储元数据了,为什么不对整篇文章都这样做呢?

    话虽如此,是的,您的初始代码 sn-p 似乎应该可以工作。

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 2021-12-01
      • 2017-12-31
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多