【问题标题】:ENOENT ERROR using fs.unlink in a Express.js Simple APP?在 Express.js 简单应用程序中使用 fs.unlink 时出现 ENOENT 错误?
【发布时间】:2015-05-12 16:10:42
【问题描述】:

js。我正在 express.js 中创建一个简单的博客。 我使用 Typicode/lowdb as database 来创建/更新/删除基于 data.json 文件上的 id 的帖子。并使用 json 数组中的 slug 数据通过 Node.js 创建/更新/删除降价帖子文件系统 API。在 Markdown 帖子的删除端,我收到一个我不明白的错误。

  { [Error: ENOENT, unlink 'C:\Users\path\to\publicfolder\undefined.md']
  errno: -4058,
  code: 'ENOENT',
  path: 'C:\\Users\\path\\to\\publicfolder\\undefined.md' }

我正在像这样使用 fs.unlink 来删除降价帖子:

   var oldSlug = "public/"+req.params.slug+".md";   

fs.unlink(oldSlug, function(err) {
    if(err) {
      console.log(err);
    } else {
      console.log("Deleted the old markdown file: " + oldSlug +"");
    }
  });

以下是部分暴露的代码示例:

创建/更新/删除帖子的示例 - Post.js

       exports.index = function (req, res) {
        res.render('post/index', { posts: db.list()});
    }; 

    exports.form = function (req, res) {
            res.render('post/form');
        };

        exports.edit = function (req, res) {
        var post = db.getById(req.params.id);
        res.render('post/edit', {post: 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});

//using this to rename and update markdown posts it work's

        var oldPath = "public/"+req.body.slug+".md";
         var newPath = "public/"+slugTitle+".md"; 

         fs.unlink(oldPath, function(err) {
            if(err) {
              console.log(err);
            } else {
              console.log("Deleted the old markdown file : oldPath ");
            }
          }); 
        fs.writeFile(newPath, description, function(err) {
                    if(err) {
                      console.log(err);
                    } else {
                      console.log("The post was updated as: newPath ");
                    }
                  }); 
        res.redirect('/post');};

        exports.remove = function (req, res) {
            db.remove(req.params.id);

//using this to delete markdown posts i get the error
//changing req.params.slug to req.body.slug still gives the error 

          var oldSlug = "public/"+req.params.slug+".md"; 
            fs.unlink(oldSlug, function(err) {
            if(err) {
              console.log(err);
            } else {
              console.log("Deleted the markdown file: " + oldSlug +"");
            }
          });
        res.redirect('/post');};

Server.js 示例

app.get('/post', post.index);
app.get('/post/create', post.form);
app.post('/post/create', post.save);
app.get('/post/details/:id', post.details);
app.get('/post/edit/:id', post.edit);
app.post('/post/update', post.update);
app.get('/post/delete/:id', post.remove);
 http.createServer(app).listen(app.get('port'), function(){
    console.log("Express server listening on port " + app.get('port'));
 });

index.jade 示例

doctype
html
    head
        title
    body
        h1 Posts
        ul
        each item in posts
            li Item #{item.name} - #{item.desc} - #{item.slug} 
                a(href='/post/details/#{item.id}') Details -
                a(href='/post/edit/#{item.id}') Edit -
                a(href='/post/delete/#{item.id}') Delete
        div
            p
                a(href='post/create') Add new

问题出在 post.js 文件中的 exports.remove 函数上,但为什么? 我希望我在代码中有意义。

【问题讨论】:

  • 你检查文件“C:\\Users\\path\\to\\publicfolder\\undefined.md”是否存在?也许req.body.slugundefined。你永远不会从视图中传递slug

标签: javascript json node.js express filesystems


【解决方案1】:

问题是您没有将变量 slug 传递给您的 remove 路由。由于您使用的是 GET,它不能来自 req.body,因此您必须在 URL 路径中或作为查询字符串传递它。

尝试更改这些行:

post.js

var oldSlug = "public/"+req.query.slug+".md";

index.jade

a(href='/post/delete/#{item.id}?slug=#{item.slug}') Delete

【讨论】:

  • 谢谢 VICTORKOHL 我从来没有想过这个问题。我对 Node.js 和 Express.js 真的很缺乏经验。我希望你不要认为这很荒谬,但我们可以使用 POST 方法TO A REMOVE ROUTE??类似这样的形式:form(id='form', action='/post/delete', method='POST') **再次感谢为您解答**
  • Sorry about the question above POST method to a remove route?!!。我还在学习Express.js路由,一个有效的方法是使用DELETE而不是POST。
  • 没问题。是的,最好使用 DELETE 删除东西。
  • 我有一个相关的问题。你愿意发表评论吗?这是链接:stackoverflow.com/questions/38625483/…
猜你喜欢
  • 1970-01-01
  • 2015-04-19
  • 2016-12-28
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
相关资源
最近更新 更多