2

目前我正在从事一个个人项目,并且在理解我的应用程序中 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并告诉我哪里出错了吗?

4

1 回答 1

1

有几种方法可以实现您的愿望。一种简单但有效的解决方案是向全局对象添加一个属性。这必须在您的主(条目)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()返回了一个导出对象,而你导出的方法都属于这个对象。

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

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

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

于 2021-03-20T19:34:45.000 回答