在express.js视图中包含函数和类

时间:2013-12-09 23:26:53

标签: node.js express

我是一名将Java SE / Swing应用程序移植到Web应用程序的Java程序员。我一直在尝试面向客户端应用程序的node.js和express.js。

我想在node.js应用程序级别定义函数,并使节点应用程序中的视图可以使用方法和属性。我主要关注的是数据建模。我想在应用程序级别定义数据模型,并让视图可以访问模型的属性和方法。

我已经调查了express.js和node.js文档,在我看来,包含('require')可以在应用程序级别完成,但它们不会传播到视图级别。

我错过了什么吗?也许这是我无法获得的JavaScript或Node的基础......

1 个答案:

答案 0 :(得分:1)

请注意,expressjs实际上并不是一个MVC框架,因此,它的“路由”,“应用程序”和“视图”的概念非常宽松,旨在使其不受影响,并且易于更改。

也就是说,一个expressjs视图通常只是一个由路由器/控制器提供的HTML模板(由EJSHandlebars提供支持),并给出一个Javascript对象来填充自己。许多Javascript模板引擎将自己描述为"logic-less templates"。因此,缺少函数/类(请注意,Node / Javascript甚至没有类的概念)。建议可能是添加一个间接级别,在该级别中,您有一个脚本可以获取模型并将其打包成您的所有模板都知道的标准对象格式。

还有一点需要注意:

Node中的require调用可能最类似于引用静态Java类。 (如果我能找到我正在考虑的引用,我会添加它,但基本上Node会加载每个脚本一次,然后为每个后续的require调用返回加载的副本。编辑:here it is, node.Module source code

编辑:映射脚本的一些示例

请注意,到目前为止Node中没有非常强大的模式,因此人们似乎正在做对他们有意义的事情。这个例子绝不是“标准”节点实践。

model-view.js

module.exports.map = function(birthyear) {
    return {
        "birthYear": birthYear,
        "age": getAge(birthYear)
    }
}

//some function on the "view"
function getAge(birthYear) {
    return (new Date()).getFullYear() - birthYear;
}

app.js

var transform = require('./model-transform');
app.get('/age/:user', function(req, res) {
    db.doSomeDatabaseRequestToGetTheUsersBirthYear(req.params.user, function(birthYear) {
        res.render('index', transform.map(birthYear));
    });
});

模板(我喜欢mustache-based模板,但您可以使用任何内容)

<html>
<body>
    You were born in {{ birthYear }}<br>
    You are probably {{ age }} years old.
</body>
</html>