代码之家  ›  专栏  ›  技术社区  ›  Richard T

nodejs的执行出了问题?

  •  0
  • Richard T  · 技术社区  · 6 年前

    node.js节点 到现有站点 能力,并一直在通过几个教程来掌握它。。。当然,作为一个有经验的程序员,我在学习一个新事物,我的实验有点超出了教程的范围。所以,我并没有用每次迭代来代替这些工作,而是在代码的基础上做了一些补充,希望在我完成之后,我有一点代码来练习所涵盖的所有内容。

    在这件事上,我发现了一个明显的执行不规范的例子,在我看来这是完全不可接受的, 但是,也许我遗漏了一些东西,这就是为什么我要发帖的原因(尽管如果我是对的,这对其他人来说也很有价值 node.js节点 程序员应该知道这一点)。

    这是 a link to the tutorial 这让我想到了这个。这是它的开始。

    但是,结果并不正确; 最后,文件还是存在的!也许更正确的是,文件创建的实例发生在潜在的文件删除之后,即使代码中的顺序不同。(请注意,这是一个测试环境,因此不像是其他用户访问了系统,导致创建时不满足删除条件。) 这很容易重复。

    代码如下:

    var http = require("http");
    var dt = require("./firstmodeule.js");
    var url = require("url");
    var fs = require("fs");
    var fn = "index.html";
    var log = "nodejs.log";
    
    http.createServer(function (req, res)
    {
        res.writeHead(200, {"Content-Type": "text/html"});
        res.write("<p>New current Date & Time: "+dt.myDateTime()+"<br>");
        res.write(req.url+"<br>"); // This captures the right hand of the URL.
        var q = url.parse(req.url, true).query;
        var txt = q.year + " " + q.month;
        res.write(txt+"</p>");
        res.write("<p></p>");
        fs.appendFile(log, dt.myDateTime()+" "+txt+"\n", function (err)
        {
          if (err) throw err;
          console.log("saved?");
        });
        fs.readFile(fn, function(err, data)
        {
           fs.writeFile("delable.index", data, function(err)
           {
              if (err)
              {
                 throw err;
              } else {
                 console.log("wrote to delable.index");
              }
           });
           res.write(data);
           res.end();
        });
        if (q.month = "Jan")
        {
           fs.unlink("delable.index", function (err)
           {
              if (err)
              {
                 throw err;
              } else {
                 console.log("Deleted delable.index");
              }
           });
        }
        //res.end(); // End CANNOT be here if we"re doing a res.write(data);
    }).listen(8080);
    

    当然你可以得到第一模块.js从引用的教程-或删除它,因为它与此无关。

    http://MySite:8080/?year=2020&month=Jan
    

    下面是一个输出示例:

    $ node example.js
    Deleted delable.index
    saved?
    wrote to delable.index
    Deleted delable.index
    saved?
    wrote to delable.index
    

    与代码的顺序相反,我们首先得到被删除的部分!

    好吧,那么,有什么好处呢?做 node.js节点

    对于任何好奇的人来说,这都是目前为止最新的代码。操作系统是过去几天下载的Fedora 28,节点包是nodejs-8.11.4条-1.fc28.x86ʂ.

    1 回复  |  直到 6 年前
        1
  •  2
  •   Chris Cousins    6 年前

    改变fs.appendFile文件到文件同步和改变fs.readFile文件到文件同步然后这些函数将是同步的,因此它们的执行顺序与代码的顺序相匹配。