求教 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了,但是不知道会不会有什么问题? 或者更好的方法?
求指教…
当然可以!你的做法是合理的,并且在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}`);
});
解释
-
模块化公共方法:
- 在
core/common.js
文件中定义了一些通用方法(如log
和format
),并将它们导出。
- 在
-
设置全局变量:
- 在
app.js
中,通过app.set('core', ...)
设置核心文件夹路径。 - 然后使用
global.core = require(...)
将这些公共方法加载到全局变量中,这样所有模块都可以访问这些方法。
- 在
-
使用公共方法:
- 在路由处理函数中,你可以直接使用
core.log
方法来记录日志。
- 在路由处理函数中,你可以直接使用
注意事项
- 避免滥用全局变量:虽然将公共方法放在全局变量中很方便,但过度使用可能会导致代码难以维护。建议只在确实需要的情况下使用全局变量。
- 模块化设计:如果公共方法较多,可以考虑将它们组织成多个模块,并根据需要引入这些模块。
通过这种方式,你可以在不频繁使用 require
的情况下,方便地使用公共方法。希望这对你有帮助!
我用的是 app.locals.xx = function(){} 这样的,每个 views 里面直接调用就好了。不知道好不好啊。
我是初学,locals貌似也不错啊,坐等大神来解答一下…
你的写法基本上是可行的,但有一些改进的地方。将一些通用方法或配置集中管理是一个好的实践。下面是一些具体的建议:
-
使用模块化的方式:通过
require
加载模块是Node.js中的常见做法,但你可以将其封装得更好。 -
使用
global
对象需谨慎:虽然你可以将某些变量挂载到全局对象上,但这可能会导致命名冲突,因此需要慎重考虑。 -
更好的组织结构:建议将这些公共模块放在一个更清晰的目录结构中,并通过模块化的形式加载。
示例代码
文件结构
/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;
通过这种方式,你可以更好地组织和管理你的代码,并且减少全局变量带来的潜在问题。