求教 Nodejs 如下写法是不是可以? 关于通用/公共方法.

求教 Nodejs 如下写法是不是可以? 关于通用/公共方法.

用的express + jade.

刚接触nodejs , 因为可能需要一些公共方法,但是为了开发方便所以不希望每个页面里面都去执行一个 require. 所以在app.js里 写了如下方法:

app.set('core', __dirname + '/core');
global.core = require(app.get("core")+"/common.js");

还有一些mvc里的helper , language , config 可以用这种方法吗?

这样每个页面都可以调用到core了,但是不知道会不会有什么问题? 或者更好的方法?

求指教…


5 回复

当然可以!你的做法是合理的,并且在Node.js中使用全局变量来存储公共方法是一种常见的方式。不过,也有一些最佳实践可以帮助你更好地管理这些公共方法。下面是一个详细的示例代码和解释。

示例代码

首先,假设你在项目根目录下有一个 core 文件夹,其中包含一个 common.js 文件,该文件定义了一些通用的方法:

// core/common.js
module.exports = {
    log: function(message) {
        console.log(`[LOG] ${message}`);
    },
    format: function(date) {
        return date.toISOString();
    }
};

接下来,在你的 app.js 文件中设置全局变量并引入这些公共方法:

// app.js
const express = require('express');
const path = require('path');
const app = express();

// 设置核心文件夹路径
app.set('core', path.join(__dirname, 'core'));

// 将核心模块加载到全局变量中
global.core = require(path.join(app.get('core'), 'common.js'));

// 使用Jade模板引擎
app.set('view engine', 'jade');

// 示例路由
app.get('/', (req, res) => {
    core.log('Home page accessed');
    res.render('index', { message: 'Hello World!' });
});

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

解释

  1. 模块化公共方法

    • core/common.js 文件中定义了一些通用方法(如 logformat),并将它们导出。
  2. 设置全局变量

    • app.js 中,通过 app.set('core', ...) 设置核心文件夹路径。
    • 然后使用 global.core = require(...) 将这些公共方法加载到全局变量中,这样所有模块都可以访问这些方法。
  3. 使用公共方法

    • 在路由处理函数中,你可以直接使用 core.log 方法来记录日志。

注意事项

  • 避免滥用全局变量:虽然将公共方法放在全局变量中很方便,但过度使用可能会导致代码难以维护。建议只在确实需要的情况下使用全局变量。
  • 模块化设计:如果公共方法较多,可以考虑将它们组织成多个模块,并根据需要引入这些模块。

通过这种方式,你可以在不频繁使用 require 的情况下,方便地使用公共方法。希望这对你有帮助!


我用的是 app.locals.xx = function(){} 这样的,每个 views 里面直接调用就好了。不知道好不好啊。

我是初学,locals貌似也不错啊,坐等大神来解答一下…

自己顶一下吧!

你的写法基本上是可行的,但有一些改进的地方。将一些通用方法或配置集中管理是一个好的实践。下面是一些具体的建议:

  1. 使用模块化的方式:通过 require 加载模块是Node.js中的常见做法,但你可以将其封装得更好。

  2. 使用 global 对象需谨慎:虽然你可以将某些变量挂载到全局对象上,但这可能会导致命名冲突,因此需要慎重考虑。

  3. 更好的组织结构:建议将这些公共模块放在一个更清晰的目录结构中,并通过模块化的形式加载。

示例代码

文件结构

/project-root
|-- app.js
|-- core/
|   |-- common.js
|   |-- helper/
|   |   |-- index.js
|   |-- language/
|   |   |-- index.js
|   |-- config/
|       |-- index.js

app.js

const express = require('express');
const path = require('path');

const app = express();

// 设置核心路径
app.set('core', path.join(__dirname, 'core'));

// 加载核心模块
const coreModules = ['common', 'helper', 'language', 'config'].reduce((acc, key) => {
    acc[key] = require(path.join(app.get('core'), key, 'index'));
    return acc;
}, {});

// 将核心模块挂载到全局对象
global.core = coreModules;

// 其他设置和中间件...
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.listen(3000, () => {
    console.log('App is listening on port 3000');
});

core/common.js

module.exports = {
    // 一些通用方法
    sayHello: (name) => {
        console.log(`Hello ${name}`);
    }
};

core/helper/index.js

module.exports = {
    // 一些帮助函数
    formatDate: (date) => {
        return date.toISOString().slice(0, 19).replace('T', ' ');
    }
};

使用示例

在其他文件中你可以这样使用这些公共方法:

const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
    global.core.common.sayHello('World'); // 输出 "Hello World"
    global.core.helper.formatDate(new Date()); // 格式化日期
    res.send('Hello from route');
});

module.exports = router;

通过这种方式,你可以更好地组织和管理你的代码,并且减少全局变量带来的潜在问题。

回到顶部