检查 writeFileSync 是否成功写入文件

66

我使用express.js定义了一个简单的路由:

exports.save = function (request, response)
{
    var file = request.body.file;
    var content = request.body.content;

    var saved = false;

    if (fs.existsSync( file ))
    {
        saved = fs.writeFileSync(file, content, 'utf8');
    }

    console.log( saved ); // undefined or false, never true

    response.send(saved ? 200 : 500, saved ? 'saved' : 'error'); // 500, error
};

if (typeof saved === 'undefined') saved = true;是唯一的选项吗?感觉不太正规。

3个回答

102
根据node.js source-codefs.writeFileSync没有返回值。如果出现问题,它会抛出一个Error对象。因此,您应该在try-catch块中编写fs.writeFileSync(file, content, 'utf8');

2
我的代码没有抛出任何错误,甚至没有创建文件。fs.writeFileSync(__dirname+"./../BusinessNames/currentDB.txt", 'nul.vyp');。不创建文件是因为nul在Windows中是保留关键字。 - Himanshu
我的代码出现了错误:未定义,但文件已经正确创建。这个错误完全是多余的。 - Manticore

12

如果没有异常发生,fs.writeFileSync不会返回任何值,这意味着保存成功;否则失败。

您可能希望尝试文件读取的异步版本。

fs.exists(file, function (exists) {
  if (exists) {
    fs.writeFiles(file, content, 'utf-8', function (err) {
      if (err) {
        response.send("failed to save");
      } else {
        response.send("succeeded in saving");
      }
  } else {
    console.log('file does not exists');
  }
}

3
异步版本与 HTTP 响应不太搭配,因此我会选择同步方式。 - tomsseisums
1
我跳过了第三个参数... :( - Marcello DeSales
2
@jolt 我知道我来晚了,但是我不认为在HTTP请求中使用它们有什么问题。你只需要在“成功”回调中执行其他操作即可。 - Jared

1

 fs.exists(file, function (exists) {
  if (exists) {
    fs.writeFiles(file, content,  err=> {
      if (err)   res.status(500).send({error: "failed to save"});
       else    res.status(200).send({message : "succeeded in saving"});
  } else {
    res.status(404).send({error: "file not exists"})
  }
}

使用异步而不是同步。这将起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接