Javascript 正在尝试使用Node.js删除文件。我应该异步使用fs.unlink(路径,回调)还是同步使用fs.unlinkSync(路径)?

Javascript 正在尝试使用Node.js删除文件。我应该异步使用fs.unlink(路径,回调)还是同步使用fs.unlinkSync(路径)?,javascript,node.js,Javascript,Node.js,我有一个简单的函数从数据库中删除一个产品条目,现在我也尝试删除该产品的图像文件。我检查了Node.js文件系统文档,发现有两个函数处理这个问题-fs.unlink(path,callback)和fs.unlinkSync(path)。我知道第一个是异步的,第二个是同步的,但是我仍然不确定应该使用哪一个,为什么 module.exports.deleteProduct = async (req, res, next) => { let productId = req.body.pro

我有一个简单的函数从数据库中删除一个产品条目,现在我也尝试删除该产品的图像文件。我检查了Node.js文件系统文档,发现有两个函数处理这个问题-
fs.unlink(path,callback)
fs.unlinkSync(path)
。我知道第一个是异步的,第二个是同步的,但是我仍然不确定应该使用哪一个,为什么

module.exports.deleteProduct = async (req, res, next) => {
    let productId = req.body.productId

    try {
        let product = await Product.destroy({
            where: {
                id: productId
            }
        })

        res.status(200).json({
            product: product
        })
    } catch (e) {
        console.log(e)
        res.status(500)
    }
}
不要阻止节点Js中的事件循环

同步方法会不必要地阻止
事件循环
,从而影响应用程序性能。请尽可能始终使用
异步
方法

或者,如果您想将它与
wait
操作(伪同步)一起使用,您可以通过将其包装在
promise

const fs=require("fs");
function unlinkPromise(file)
{

  return new Promise((resolve,reject)=>{
    fs.unlink(file,(err,data)=>{
      
      if(err)
      {
        reject(err);
      }
      resolve(data);
    })
  })
}

async function data()
{
  console.log(await unlinkPromise("file"));
}

如果您的服务器操作系统是Linux或其他带有本地文件系统的UNIX衍生产品,则
.unlinkSync()
.unlink()
都可以快速运行:操作系统级的取消链接操作旨在快速、可预测地完成。因此,如果您使用blocking
.unlinkSync()
版本,您不会造成太大的伤害,尤其是如果您的取消链接很少发生

也就是说,如果您可以使用异步版本,那么这样做是一个很好的实践


看起来你可以;您可以在回调中调用
res.status()…
,也可以在
等待后调用

一些代码和想法:

正如其他人已经说过的,
async
sync
好,因此您不会最终阻塞,即使,除非您的API量非常高,否则它可能不会有什么影响,如另一个答案所示

您可以通过以下方式使用fs
promises
API

const fs = require('fs').promises; //es5 OR
import { promises as fs } from 'fs'; //es6
将异步(非阻塞)API与一行程序一起使用
wait

特别注意:如果未能取消目录链接,您可能不希望API请求失败,因为您实际上从数据库中删除了产品

// make sure you are using the promise API from fs
const fs = require('fs').promises;

module.exports.deleteProduct = async (req, res, next) => {
    let productId = req.body.productId

    try {
        let product = await Product.destroy({
            where: {
                id: productId
            }
        })

        try { 
            await fs.unlink('the/path/to/the/product/image');
        } catch {
          // you may want to handle a failure to delete separately
        }

        res.status(200).json({product: product})
    } catch (e) {
        console.log(e)
        res.status(500)
    }
}

始终使用异步。同步函数只适用于单用户脚本。上下文是什么?如何调用代码?(即,这是哪个更大的进程的一部分?)嗯,是的,这也会起作用。如果我们想使用原始回调样式的方法,这只是对OP的一个建议。哦,我可以在fs.unlink!上使用wait,这太好了!。出于好奇,如果我在当前代码中没有使用try-catch块包围wait fs.unlink,那么无论出于何种原因,如果取消链接失败,我都会发送一个500状态,即使产品删除会通过,对吗?@Bobimaru-你完全正确。这就是为什么我建议您可能希望单独处理
取消链接
产生的任何错误。嘿,我刚刚尝试了async/await fs.unlink,实际上我遇到了一个错误,指出-TypeError[ERR\u INVALID\u CALLBACK]:回调必须是一个函数。接收未定义。我假设这是因为,我没有提供回调作为取消链接函数的辅助参数,但我认为在使用async/await时不需要它。@Bobimaru-请确保您使用的是
require('fs')。promises
而不仅仅是
require('fs')
-或者如果您使用的是es6
import{promises as fs}来自“fs”