我正在从节点9.5运行以下内容:
const { lstatSync, readdirSync } = require('fs');
const { resolve } = require('path');
const isDirectory = source => lstatSync(source).isDirectory();
const getDirectories = source =>
readdirSync(source).map(name => resolve(source, name)).filter(isDirectory);
try {
const apiRoutes = getDirectories(__dirname + '/api');
if (apiRoutes.length === 0) {
throw new Error('API root must contain directories');
}
console.log(apiRoutes);
return apiRoutes;
} catch (e) {
console.error(`${e.name}: ${e.message}`);
}
//Why don't these fire?
console.log(apiRoutes);
console.log('foo');
假设 api 中有两个目录,try块中的第一个console.log(apiRoutes)
记录:
[/basedir/api/dir1,/basedir/api/dir2]
然而,在try块运行后我无法获得任何结果。如果我在try块中没有返回apiRoutes
,我会收到undefined
错误。
如何从try块返回值?
为什么不记录 foo ?
答案 0 :(得分:3)
apiRoutes
const
蚂蚁的范围在try
区块内。
重构代码,以移动console.log
块中的try
,或更改为在外部范围内使用apiRoutes
定义let
;并通过调用getDirectories
在try块中设置其值。
此声明创建一个常量,其范围可以是声明它的块的全局或局部。与var变量不同,全局常量不会成为窗口对象的属性。需要一个常量的初始化器;也就是说,你必须在声明它的同一语句中指定它的值(这是有道理的,因为它不能在以后更改)。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
答案 1 :(得分:1)
您可能需要在try / catch之外声明apiRoutes。一旦try / catch完成,你就会失去变量的范围。