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;


6 回复

当然可以。在Node.js中使用Express框架时,将app对象传递给控制器(或服务)是一个常见的需求,尤其是在处理全局配置或共享数据时。下面是通过一种常见的方式来实现这一点的步骤和示例代码。

步骤概述

  1. 创建一个Express应用实例:这通常在app.js文件中完成。
  2. 配置应用实例:包括设置中间件、路由等。
  3. 将配置好的应用实例传递给控制器:这可以通过模块导出的方式进行。

示例代码

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

用 Router 啊

在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 到控制器文件,而是通过传递的方式使控制器可以访问到应用实例。

回到顶部