node.js - 错误:ENOENT:没有这样的文件或目录,取消链接

Posted

技术标签:

【中文标题】node.js - 错误:ENOENT:没有这样的文件或目录,取消链接【英文标题】:node.js - Error: ENOENT: no such file or directory, unlink 【发布时间】:2020-04-09 10:59:33 【问题描述】:

我有以下函数将.wav 文件转换为.mp3。如您所见,在使用ffmpeg模块转换音频文件之前,我已经检查了文件是否存在,然后在转换时,我只保留新文件并删除旧文件。但偶尔控制台会抛出错误Error: ENOENT: no such file or directory, unlink,这意味着我unlink(删除)了一个不存在的文件。我不明白为什么,因为我甚至在转换之前就已经进行了存在检查,所以它应该已经存在才能取消链接。

module.exports.convertAndMoveElastic = async (calllog) => 
    let  start, sip_uri, direction, source, destination  = calllog;
    const VNtimezoneOffset = 7 + new Date().getTimezoneOffset() / 60;
    const startTime = new Date(start + VNtimezoneOffset * 3600000 - 60000);
    const date = startTime.getDate() < 10 ? `0$startTime.getDate().toString()` : startTime.getDate().toString();
    const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    const month = months[startTime.getMonth()];
    const year = startTime.getFullYear().toString();
    sip_uri = sip_uri || (direction === 'outgoing' ? source : destination);
    const [extension, domain_name] = sip_uri.split("@");
    return new Promise(async (resolve, reject) => 
        const links = await getLinkWithElastic(calllog);
        if (!links)  return reject(); 
        let file_id, filepath;
        for (let link of links) 
            const  callid, sipCallid, uuid, record_path  = link._source;
            if (record_path) 
                let recordPathArr = record_path.split('/');
                file_id = recordPathArr[recordPathArr.length - 1].split('.')[0];
                filepath = path.resolve(base_directory, domain_name, 'archive', year, month, date, `$file_id.wav`);
            
            if (!file_id || !fs.existsSync(filepath)) 
                file_id = callid;
                filepath = path.resolve(base_directory, domain_name, 'archive', year, month, date, `$file_id.wav`);
            
            if (!file_id || !fs.existsSync(filepath)) 
                file_id = uuid;
                filepath = path.resolve(base_directory, domain_name, 'archive', year, month, date, `$file_id.wav`);
            
            if (fs.existsSync(filepath))  break; 
        
        if (!fs.existsSync(filepath))  return reject(); 
        ffmpeg(filepath)
            .audioCodec('libmp3lame')
            .on('error', function (error) 
                reject(error);
            )
            .on('end', function () 
                resolve( recordUrl: `$host/record/download/$file_id.mp3` );
                fs.unlinkSync(filepath);
            )
            .toFormat('mp3')
            .saveToFile(path.resolve(dest_directory, file_id + ".mp3"));
    );
;

【问题讨论】:

【参考方案1】:

在您的 unlink() 方法中使用 util.promisify

https://***.com/a/45463672/3793648

【讨论】:

以上是关于node.js - 错误:ENOENT:没有这样的文件或目录,取消链接的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 node.js 文件上传 ENOENT 错误?

使用 Node 8.9.4 LTS 安装 Sails.js 依赖项时,NPM“ENOENT:没有此类文件或目录错误”

node.js fs.rename() 错误 enoent

产生 ENOENT node.js 错误

Node js ENOENT 文件错误处理

Node.js 错误 ENOENT,未更改任何内容时打开“文件/路径”