nodejs 执行出现问题?

nodejs execution comes out of order?

我正在将 node.js 添加到现有站点,因为它具有 "server side Java Script" 功能,并且已经按照几个教程来掌握它。 ...当然,作为一名学习新事物的经验丰富的程序员,我正在尝试一些超出教程可能提供的内容。因此,我没有在每次迭代中都付出努力,而是一直在添加代码的功能,希望当我完成时,我有一段代码可以练习涵盖的所有材料。

在这样做的过程中,我发现了一个乱序执行的明显例子,在我看来这是完全不可接受的,但也许我遗漏了一些东西,这这就是我发帖的原因(尽管它对其他追随者也很有价值,如果我是对的,所有 node.js 程序员都应该知道)。

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

当我到达文件访问部分时,由于我们在学习如何从 URL 填充变量值后不久就开始学习如何创建和删除文件,我决定使用条件值来删除根据用户在 URL 中提供的内容新建或更新的文件。这对我来说似乎是完全合理的!

但是,结果并不正确; 尽管删除文件的代码发生在创建文件的代码之后,但实际上删除发生在创建之前,所以最终文件仍然存在!也许更正确的是,文件创建实例发生在潜在的文件删除之后,即使代码中的顺序不是这样。 (请注意,这是一个测试环境,因此并不是说某些其他用户访问了系统导致在不满足删除条件的情况下创建。)这很容易重复。

代码如下:

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);

当然,您可以从引用的教程中获取 firstmodule.js 的一小段代码 - 或者直接删除它,因为它与此无关。

下面是 URL 的示例:

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 是否只是按照它想要的顺序做事?

对于任何好奇的人,这是截至该日期的所有最新代码。 OS是前几天下载的Fedora 28,node包是nodejs-8.11.4-1.fc28.x86_64.

将 fs.appendFile 更改为 fs.appendFileSync 并将 fs.readFile 更改为 fs.readFileSync 然后功能将同步,因此执行顺序与顺序匹配你的代码。