Nodejs express,app怎么传到controller上?
Nodejs express,app怎么传到controller上?
我用了webstorm新建一个项目,然后:
app.js
app.locals.title = ‘123’; (不要这个) app.set(‘xxxx’,‘xxxxxxxxxxxx’)
routers/index.js
var express = require(‘express’); var router = express.Router(); var app = require(’…/app’); console.log(1,app.get(‘xxxx)); —> 没有get方法 /* GET home page. */ router.get(’/’, function(req, res) { res.render(‘index’, { title: ‘Express’ }); });
module.exports = router;
当然可以。在Node.js中使用Express框架时,将app
对象传递给控制器(或服务)是一个常见的需求,尤其是在处理全局配置或共享数据时。下面是通过一种常见的方式来实现这一点的步骤和示例代码。
步骤概述
- 创建一个Express应用实例:这通常在
app.js
文件中完成。 - 配置应用实例:包括设置中间件、路由等。
- 将配置好的应用实例传递给控制器:这可以通过模块导出的方式进行。
示例代码
app.js
首先,在app.js
中创建并配置你的Express应用实例:
const express = require('express');
const path = require('path');
const app = express();
// 设置一些全局配置
app.set('title', '123');
// 引入路由
const indexRouter = require('./routes/index');
// 使用路由
app.use('/', indexRouter);
// 监听端口
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
module.exports = app; // 将app对象导出
routers/index.js
然后,在你的路由文件中引入并使用这个app
对象:
const express = require('express');
const router = express.Router();
const app = require('../app'); // 引入app.js中的app对象
router.get('/', (req, res) => {
// 你可以直接访问app中设置的全局配置
console.log(app.get('title')); // 输出: 123
res.render('index', { title: app.get('title') });
});
module.exports = router;
解释
- 在
app.js
中,我们创建了一个Express应用实例,并设置了全局配置(如app.set('title', '123')
)。同时,我们将app
对象导出,以便其他模块可以访问它。 - 在
routers/index.js
中,我们通过require('../app')
导入了这个app
对象,并可以在路由处理函数中使用它来访问全局配置或执行其他操作。
这种方式使得全局配置和数据能够被整个应用共享,而不需要每个控制器都重复定义这些配置。
。。。 app.js最后加上 module.export = app;
其实我推荐的的写法是 conf.js var conf = {} conf.title = ‘xxx’
router/index require(’…/conf.js’) console.log(conf.title)
//其实说到底,直接用require,不需要exports。
打印的是什么? app.locals.title
在Node.js中使用Express框架时,通常会将应用实例(app
)传递给控制器(或服务层),以便可以访问全局配置、中间件和其他设置。但更常见的做法是将路由定义与业务逻辑分离,业务逻辑放在单独的文件(控制器)中。
示例代码
1. 修改 app.js
文件
const express = require('express');
const path = require('path');
const bodyParser = require('body-parser'); // 假设需要body-parser
const app = express();
// 设置模板引擎
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// 使用中间件
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// 引入控制器
const indexController = require('./controllers/indexController');
// 使用路由
app.use('/', indexController.routes(app));
module.exports = app;
2. 创建控制器文件 controllers/indexController.js
const express = require('express');
function routes(app) {
const router = express.Router();
// 传递应用实例给控制器
router.locals.app = app;
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: app.get('title') });
});
return router;
}
module.exports = { routes };
解释
- app.js 中引入了控制器,并且通过
app.use()
方法使用它。 - 在
indexController.js
控制器中,我们创建了一个名为routes
的函数,它接收app
参数,并将它赋值给router.locals.app
。这样,在控制器中的任何地方都可以访问到app
实例。 - 然后在路由处理函数中,你可以直接通过
router.locals.app
访问到app
的属性或方法。
这种方式避免了直接引用 app
到控制器文件,而是通过传递的方式使控制器可以访问到应用实例。