我正在将 node.js 添加到现有站点中,以提供其“服务器端Java脚本” 功能,并且已经通过一些教程来获得处理。 ...当然,作为一个经验丰富的程序员学习新事物,我正在尝试一些超出教程可能提供的东西。因此,我一直在增加代码的作用,而不是每次迭代都花些力气,希望当我完成后,我会有一点代码来练习所涉及的所有材料。
在执行此操作时,我发现了一个明显的乱序执行示例,在我看来这是完全不可接受的,,但是也许我错过了一些东西,这就是为什么我发布(尽管对其他遵循此规则的人也很有价值,如果我没错,所有 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的少量代码-或删除它,因为它对此没有影响。
以下是网址的示例:
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_64。
答案 0 :(得分:2)
将fs.appendFile更改为fs.appendFileSync,并将fs.readFile更改为fs.readFileSync,然后功能将同步,因此执行顺序与代码顺序相匹配。