簡體   English   中英

嘗試使用 Node.js 刪除文件。 我應該使用異步 fs.unlink(path, callback) 還是同步 fs.unlinkSync(path)?

[英]Trying to delete a file using Node.js. Should I use asynchronously fs.unlink(path, callback) or synchronous fs.unlinkSync(path)?

我有一個簡單的 function 從數據庫中刪除產品條目,現在我也在嘗試刪除該產品的圖像文件。 我檢查了 Node.js 文件系統文檔,發現了 2 個處理該問題的函數 - 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)
    }
}

如果您的服務器操作系統是 Linux 或其他一些具有本地文件系統的 UNIX 衍生產品,則.unlinkSync().unlink()都可以快速運行:操作系統級別的取消鏈接操作旨在快速且可預測地完成。 因此,如果您使用阻塞的.unlinkSync()版本,您不會造成太大的傷害,尤其是在您不經常取消鏈接的情況下。

話雖如此,如果您可以使用異步版本,那么這樣做是一個好習慣。

看起來你可以; 您可以在回調中或在await之后調用res.status()...

一些代碼和一個想法給你:

正如其他人已經說過的那樣, asyncsync更好,因此即使您最終不會阻塞,除非您的 API 音量非常高,否則這可能無關緊要,如另一個答案所示。

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

const fs = require('fs').promises; //es5 OR
import { promises as fs } from 'fs'; //es6

使用帶有單行await的異步(非阻塞) API 。

特別注意:如果您未能取消鏈接目錄,您可能不希望您的 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)
    }
}

不要阻塞 Node Js 中的事件循環

同步方法會不必要地阻塞event loop ,這會影響您的應用程序性能。盡可能使用async方法。

或者,如果您想將它與await操作(偽同步)一起使用,您可以執行以下操作,方法是將其包裝在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"));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM