如何在我的本地应用程序中正确使用模块导出

How to use module exports correctly in my local app

目前我正在做一个个人项目,运行 在理解我的应用程序中 module.exports 的功能时遇到了问题...

我的应用程序结构如下所示:

app
├── common
│   ├── cmd
│   │   ├── run-cmd.js
├── routes
│   ├── system
│   │   ├── temp.js

我希望实现一种方法,将可重用函数存储在我的应用程序的单独位置(在此示例中 run-cmd.js),并让它们在我的应用程序的其余部分易于访问(temp.js ) 而不必专门引用文件路径(例如:require(../../folder/folder/file)

这里是run-cmd.js:

const { spawn } = require("child_process");

module.exports.runCmd = (cmd, callback) => {
    var command = spawn(cmd, [], {shell:true});
    const REGEX_LINE_BREAK = /(\r\n|\n|\r)/gm;
    var result = '';

    command.stdout.on('data', function(data) {
        console.log(data.toString())
        result += data.toString().replace(REGEX_LINE_BREAK, "");
    });

    command.on('close', (code) => {
        console.log("code: " + code)
        return callback(result);
    });
} 

这里是temp.js:

var express = require('express'),
    router = express.Router(),
    runCmd = require('../../common/cmd/run-cmd');

// Add a binding to handle '/temp'
router
    .get('/temp', (req, res) => {
        runCmd('vcgencmd measure_temp', function(result) {
            console.log("Result we are prepping to send: " + result);
            res.json({result: result});
        });
    });

module.exports = router;

我觉得上面的 require() 示例违背了使用 module.exports 的灵​​活性的目的......在其中做 require(./run-cmd) 甚至 require(from-root/path/run-cmd) 之类的事情在我的应用程序中的其他位置引用要好得多。此外,在当前示例中,我收到一条错误消息 TypeError: runCmd is not a function.

任何人都可以帮助消除我对使用 module.exports 的一些困惑并告诉我哪里出错了吗?

有多种方法可以实现您的愿望。一种简单但有效的解决方案是向全局对象添加一个属性。这必须在您的主(入口)js 文件中完成,在任何 require 语句之前:

(以下路径是假设您的入口 js 文件位于 app 文件夹中)

global.__runCmdPath = __dirname + '/common/cmd/run-cmd';

然后,在您想要从中要求的任何其他模块中 runCmd 您可以简单地:

const runCmd = require(__runCmdPath);

您甚至可以将包含您要导出的函数的脚本的基本目录设置为全局对象的属性,然后只需附加单个脚本名称,例如:

const runCmd = require(__scriptsDir + '/run-cmd');
const runCmd2 = require(__scriptsDir + '/run-cmd2');

另一种策略是将脚本文件夹添加到 NODE_PATH 环境变量,对于 UNIX 使用以下命令:

export NODE_PATH=./common/cmd

和 Windows:

set NODE_PATH=./common/cmd

然后,您可以命令 node app.js,这样,您就可以在任何地方 require('run-cmd')。只要您记得在每次开始新的 shell 会话时重新设置变量,这就会起作用。

关于 TypeError: runCmd is not a function.,如果您尝试从您需要的地方直接调用 runCmd,这将继续发生。这是因为require()returns一个导出对象,而你导出的方法都属于这个对象

如果您想调用导出的 runCmd 方法,在这种情况下,您必须这样做:

runCmd.runCmd('vcgencmd measure_temp', function(result) {
            console.log("Result we are prepping to send: " + result);
            res.json({result: result});
        });

因此,您可能希望将包含导出对象的常量或 runCmd 函数的导出名称重命名为最适合您的名称。