【问题标题】:Why doesn't this try and catch work in this case?在这种情况下,为什么不尝试捕获工作?
【发布时间】:2019-06-23 12:48:34
【问题描述】:

我正在学习 Node.js,但不明白为什么这不起作用。问题是什么?感谢您的回答。

const fs = require('fs')
const path = require('path')

try {
    fs.mkdir(path.join(__dirname, '/test'), {}, err => {
    console.log(err)
    if (err) throw err
    })
}
catch (err) {
    console.log('file is already created')
}

这是结果:

错误:EEXIST:文件已存在,mkdir 'c:\Users\stefa\Desktop\programming\learning-node\playground\paths\test'

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    err => {/**/} 的 lambda 表达式创建的回调是异步运行的。 try-catch 无法理解。

    您应该使用Promises/Futures 或fs.mkdir 函数的同步版本,fs.mkdirSync

    试试这样的:

    const fs = require('fs')
    const path = require('path')
    
    try {
        fs.mkdirSync(path.join(__dirname, '/test'));
    }
    catch (err) {
        console.log('file is already created')
    }
    

    const fs = require('fs');
    const path = require('path');
    const util = require('util');
    const mkdirPromisifed = util.promisify(fs.mkdir);
    
    (async() {
        // ... all other code also should be written in async manner ...
        try {
            await mkdirPromisifed(path.join(__dirname, '/test'));
        }
        catch (err) {
            console.log('file is already created')
        }
    }());
    

    【讨论】:

    • 不推荐Sync I/O 操作。相反,请显示正确执行此操作。
    • @T.J.Crowder 我会尽快添加答案,然后我会为新手添加示例或更详细的描述。
    • mkdirSynced 将是该函数的误导性名称,因为承诺版本将是一个异步函数。
    • 最好还是使用promise-enabled fs api,如I show here
    【解决方案2】:

    正如 PsychoX 所说,回调是异步调用的

    你有几个选择:

    1. 只需使用回调

    2. 使用promises-based fs API(或在mkdir上使用util.promisify,但是...)

    3. (不推荐)使用mkdirmkdirSync)的同步版本

    这里是#1:

    const fs = require('fs')
    const path = require('path')
    
    fs.mkdir(path.join(__dirname, '/test'), {}, err => {
        if (err) {
           console.log('file is already created')
           return
        }
        // Do the next thing here
    })
    

    这里是#2,使用fsPromises.mkdir

    const fsp = require('fs').promises
    const path = require('path')
    
    fsp.mkdir(path.join(__dirname, '/test'))
    .then(() => {
        // Do the next thing here
    })
    .catch(err => {
       console.log('file is already created')
    })
    

    或在async 函数内:

    try {
        await fsp.mkdir(path.join(__dirname, '/test'))
        // Do the next thing here
    } catch (err) {
       console.log('file is already created')
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-06
      • 1970-01-01
      • 2017-11-26
      • 2010-12-29
      • 1970-01-01
      • 2021-08-05
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多