Node.js:在导出的快递路线中引用和修改主js文件中的变量

时间:2019-03-21 20:01:02

标签: javascript node.js express module routing

我正在使用Express作为路由器在Node.js中编写的家庭自动化程序的后端。目前,我有大约50条用于前端的信息传递路线,但是这些路线有时很长,它们涵盖了程序的不同方面(查询和更新设备状态,处理活动和第三方API,例如Google和Plex等)。我打算将路线移动到单独的文件中,以提高可读性和维护代码/路线的能力,但是我遇到了问题。以下是我的其中一条路线的示例:

app.route('/api/devices/:deviceID/set/:state').get( async (req, res) => {
    if (!checkRequest(req, res)) return;

    var index = parseInt(req.params.deviceID);
    var device = devices[index];
    if (device === undefined) {
        res.status(404).json({error: 'DeviceNotExist'});
        return;
    }
    var state = req.params.state === '1' ? true : (req.params.state === '0' ? false : undefined);

    let d = await device_tools.setDeviceState(device, state, modules);
    if (d === undefined) {
        res.status(500).json({error: 'DeviceNotResponsive'});
        return;
    }
    let dd = getSendableDevice(d.deviceID);
    res.json(dd);
});

如您所见,路由本身取决于对象数组“设备”和对象“模块”,它们是我的server.js文件中的变量。但是,有些路线(包括上面的路线)可以修改对象本身。我以前通过要求将server.js外部的函数传递给变量来解决此问题(如在从device_tools模块调用“ setDeviceState”的行中),但是由于路由不是“函数”,因此我可以称呼它们,我不能将这些“全局”(它们不是全局的,但我不知道如何描述它们的范围,也许是顶级?)变量传递给API端点。对我来说幸运的是,我无论如何都在完全重构程序(从模块移向可以将静态函数封装在对象类中以及定义和抽象对象数据成员的ES6对象)。可以接受任何建议,但是我更喜欢尽可能接近香草JS,因为如果可以的话我不想添加额外的依赖项。如果我对问题的解释还不够,我很乐意发布更多代码,并在使我更接近解决方案的情况下将其分解。预先感谢!

1 个答案:

答案 0 :(得分:0)

您可以创建一个导出所需的全局变量的模块。将其导入您需要的所有模块中。

模块仅被评估一次,因此您所有的模块都将引用相同的变量。