我正在学习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'
答案 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所说,回调被称为异步。
您有几种选择:
只需使用回调
使用promises-based fs API(或在util.promisify
上使用mkdir
,但是...)
(不推荐)使用mkdir
(mkdirSync
)的同步版本
这里是#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')
}