Nodejs从try ... catch返回

时间:2018-02-15 03:34:09

标签: javascript node.js

我正在从节点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

2 个答案:

答案 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完成,你就会失去变量的范围。