Express JS module.export让我感到困惑

时间:2017-06-29 01:08:08

标签: javascript node.js express

我正在学习快速JS(EJS模板引擎)并使用快速生成器来创建我的项目。 我在启动代码中只进行了一些更改。

MyApp-> routes-> index.js

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

var c_index = require('../controllers/c_index');

/* GET home page. */
router.get('/', c_index);

module.exports = router;

MyApp-> controllers-> c_index.js

var m_index = require('../models/m_index');

module.exports = function(req, res, next) {
  res.render('index', m_index);
};

MyApp->模型 - > M_索引

module.exports = function() {
  return { title: 'Express' };
};

MyApp->&则须─GT; index.ejs

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
  </body>
</html>

当我运行此代码时,chrome继续加载,当我关闭浏览器时,我得到了

GET / - - ms - -

当我编辑MyApp-&gt; controllers-&gt; c_index.js时,

res.render('index', m_index());

有效。
这让我感到困惑,因为,

router.get('/', c_index);

没有括号。但是,

res.render('index', m_index());

有括号。
我的问题是为什么一个人没有括号但其他人没有括号? 尽管

router.get('/', c_index(req, res, next));

无效。
请帮我。谢谢。

3 个答案:

答案 0 :(得分:0)

m_index是一个如下所示的模块:

module.exports = function() {
  return { title: 'Express' };
};

因此,当您执行const m_index = require('m_index')之类的操作时,m_index就是一个函数。

要调用函数,请使用括号。 m_index()调用名为m_index的函数并返回结果。

c_index.js也会导出一个函数。

res.render(..., m_index())看起来像是因为res.render想要传递一个对象,而不是一个函数。所以你调用函数,得到一个对象作为结果,并将其传递给res.render

router.get(..., c_index)看起来像是因为router.get想要传递一个函数,所以你不应该自己调用它。

答案 1 :(得分:0)

当您致电res.render('index', m_index());时,您正在通过调用'index'视图进行回复来呈现视图,然后调用本地对象m_index

它遵循以下语法,可在此处找到更多信息res.render()

res.render(view [, locals] [, callback])

接下来,在您的第二个问题中,您询问两个不同的电话

  1. router.get(&#39; /&#39;,c_index);
  2. res.render(&#39; index&#39;,m_index());
  3. 您的第一个电话是路径'/'和回调c_index对象,使用get应用此语法。查看此处的示例,可在此处更多地回答router.METHOD

    router.METHOD(path, [callback, ...] callback)
    

    此处您的第二次电话会议遵循与上述相同的范例

    res.render('index', m_index());
    

    尝试使用m_index和c_index尝试了解您的呼叫时尝试使用typeof运算符。希望这会有所帮助。

答案 2 :(得分:0)

使用SMVC进行更改,希望它能帮助您在nodejs中启动结构。

<强> app.js

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

var index = require('../routes/index');

/* GET home page. */
router.get('/', index);

module.exports = router;

在routes / index.js

var SomeController = require('../controllers/SomeController');

module.exports = function (express) {
    var router = express.Router();
    var someController = new SomeController ;
    router.get('/', someController.yourAction);
    return router;
}

在controllers / SomeController.js中,You could use ES6 with Class

class SomeController {
    yourAction(req, res, next) {
        // Do something. Use Model & Service if you want to work with DB
        res.render('/home', {hi: "Hello guy ^^"});
    }
}
module.exports = SomeController;

在home.hbs(或home.ejs ...)中 - 我建议你使用.hbs和模板引擎。 See more

  

使用hbs:{{hi}}

     

使用ejs:&lt;%= hi%&gt;

你有什么问题吗?请评论,我可以帮到你......