[英]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()...
一些代碼和一個想法給你:
正如其他人已經說過的那樣, async
比sync
更好,因此即使您最終不會阻塞,除非您的 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.