在这种情况下,为什么不尝试并抓住工作呢?

时间:2019-06-23 12:48:34

标签: javascript node.js

我正在学习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'

2 个答案:

答案 0 :(得分:4)

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

您应该使用Promise / Future s或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')
    }
}());

答案 1 :(得分:3)

如PsychoX所说,回调被称为异步

您有几种选择:

  1. 只需使用回调

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

  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
})

这里是第二名,使用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')
}
相关问题