Javascript 正在尝试使用Node.js删除文件。我应该异步使用fs.unlink(路径,回调)还是同步使用fs.unlinkSync(路径)?
我有一个简单的函数从数据库中删除一个产品条目,现在我也尝试删除该产品的图像文件。我检查了Node.js文件系统文档,发现有两个函数处理这个问题-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
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量非常高,否则它可能不会有什么影响,如另一个答案所示
您可以通过以下方式使用fspromises
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')
-或者如果您使用的是es6import{promises as fs}来自“fs”