Javascript 使用Node.js,如何要求用户确认覆盖文件?

Javascript 使用Node.js,如何要求用户确认覆盖文件?,javascript,node.js,readline,Javascript,Node.js,Readline,我在Javascript/Node.js中有一个命令行程序,可以将数据写入文件 如果文件已经存在,我想请求用户确认覆盖该文件 这失败了: 函数writeData(文件名、数据){ var fs=需要('fs'); 试一试{ writeFileSync(文件名,数据,{flag:'wx'}); }捕获(e){ 如果(e.code==“EEXIST”){ console.error(“文件已存在”); var readline=require('readline'); var rl=readline

我在Javascript/Node.js中有一个命令行程序,可以将数据写入文件

如果文件已经存在,我想请求用户确认覆盖该文件

这失败了:

函数writeData(文件名、数据){
var fs=需要('fs');
试一试{
writeFileSync(文件名,数据,{flag:'wx'});
}捕获(e){
如果(e.code==“EEXIST”){
console.error(“文件已存在”);
var readline=require('readline');
var rl=readline.createInterface(process.stdin,process.stdout);
rl.问题(“覆盖?[是]/否:”,功能(答案){
如果(回答=“否”){
console.log(“不覆盖,再见”);
流程退出(1);
}
否则{
console.log(“覆盖文件”);
试一试{
writeFileSync(文件名,数据,{flag:'w'});
}接住(ee){扔ee;}
rl.close();
}
});//问题()
}
else{抛出e;}
}//捕获(e)
}
书面数据(“/tmp/foo”,“foo-bar”);
console.log(“做点别的”);
书面数据(“/tmp/bar”、“bar-baz”);
console.log(“完成”);
进程退出(0);
此操作失败:程序不等待用户输入并存在

注意:需要运行两次才能看到故障。 第一次,它可以很好地创建文件


我应该如何继续?

使您的
writeData
异步。这更适合node.js范例:

var fs = require('fs');
var readline = require('readline');
var rl = readline.createInterface(process.stdin, process.stdout);    

function writeData (filename, data, done){
  fs.writeFile(filename, data, {flag: "wx"}, function (err) {
    if (err){
      if(err.code == "EEXIST"){
        console.error("File " + filename + "already exists.");
        rl.question("Overwrite? [yes]/no: ", function(answer) {
          if(answer === "no") {
              console.log ("Not overwritting " + filename);
          } else {
              console.log ("Overwriting " + filename);
              fs.writeFile(filename, data, done);
          }
        });
      } else {
        if(done) done(err);
      }
    }
    else if(done) done(null);
  });
}

writeData ("/tmp/foo", "foo bar", function(err){
  if(err) throw err;
  writeData ("/tmp/bar", "bar baz", function(){process.exit(0)});
});

由于writeData正在调用一些异步函数(readline),因此它需要提供回调(您将回调传递给函数,并在文件更新后进行回调。需要明确的是,writeData仍然是同步的,因为您正在调用xxxSync方法(并且您没有通过添加回调使其同步)但是readline是异步的。所以您的函数必须等待readline完成。回调是继续的信号,这就是为什么下一个console.writeline在回调中

否则,console.log将在writeData内部的readline完成之前运行:

writeData ("/tmp/foo", "foo bar");
console.log ("do something else");
您需要执行以下操作:

function writeData (filename, data, fn) {
    ...
        rl.question("Overwrite? [yes]/no: ", function(answer) {
            if (answer === 'yes) {
                  // do work
                  fn(null);  // null is err
                  return;
然后在通话中:

writeData ("/tmp/foo", "foo bar", function(err) {
    if (err) { 
        // handle, return, 
    }
    console.log ("do something else");
});

签出释放一些嵌套的回调地狱。

在写入数据后,我有其他函数,在出错时退出进程。但是删除
exit()
并不能更好地工作:传递提示,打印
console.log()
,然后才查询用户输入(没有提示)--顺便说一句,只有一个答案被采纳。试试看!你的答案成功了吗?还没有,我正忙着做其他事情,但我肯定会回到这个问题上来的!谢谢你的回答