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

Node.js 在express.js视图中包含函数和类,node.js,express,Node.js,Express,我是一名Java程序员,将JavaSE/Swing应用程序移植到web应用程序。我一直在为面向客户端的应用程序尝试node.js和express.js 我想在node.js应用程序级别定义函数,并在node应用程序中为视图提供方法和属性。我主要关心的是数据建模。我想在应用程序级别定义数据模型,让视图能够访问模型的属性和方法 我已经调查了express.js和node.js文档,在我看来,include('require's)可以在应用程序级别上完成,但它们不会传播到视图级别 我错过什么了吗?也许

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

我想在node.js应用程序级别定义函数,并在node应用程序中为视图提供方法和属性。我主要关心的是数据建模。我想在应用程序级别定义数据模型,让视图能够访问模型的属性和方法

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


我错过什么了吗?也许这是JavaScript或Node的一些基本特性,我不明白…

请注意,expressjs并不是一个真正的MVC框架,因此,它的“路由”、“应用程序”和“视图”的概念非常松散,并且设计为无关联且易于更改

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

还需要注意的是:

require
调入节点可能最类似于引用静态Java类。(如果我能找到我正在考虑的引用,我会添加它,但基本上节点会加载每个脚本一次,然后为每个后续的
require
调用返回加载的副本。编辑:)

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

请注意,到目前为止,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;
}
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));
    });
});
app.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;
}
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));
    });
});
模板(我喜欢模板,但你可以使用任何东西)


你出生在{{出生年份}
你可能已经{{age}岁了。
请注意,expressjs并不是一个真正的MVC框架,因此,它的“路线”、“应用程序”和“视图”的概念非常松散,并且设计为不附带任何内容,易于更改

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

还需要注意的是:

require
调入节点可能最类似于引用静态Java类。(如果我能找到我正在考虑的引用,我会添加它,但基本上节点会加载每个脚本一次,然后为每个后续的
require
调用返回加载的副本。编辑:)

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

请注意,到目前为止,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;
}
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));
    });
});
app.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;
}
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));
    });
});
模板(我喜欢模板,但你可以使用任何东西)


你出生在{{出生年份}
你可能已经{{age}岁了。
Michael,谢谢你的意见。您是否介意详细介绍一下“添加一个间接级别,在该级别中,您有一个脚本,该脚本将您的模型打包为所有模板都知道的标准对象格式”?对我来说,这是缺失的部分。我可以想象这只是一个脚本(可能是
model transform.js
?),您在其中有一个导出函数,它将数据作为参数,然后简单地将它们移动到您需要的地方,并将它们作为格式化对象输出。然后您可以执行类似于
var transform=require('./model transform')。。。res.render('index',transform.someFunction(您的数据))。这可能与Java之类的映射类同义。Michael,在视图中,如何引用通过res.render中的第二个参数传入的函数或值?例如,如果视图调用了需要访问res.render调用中引用的对象的事件处理程序脚本,我可以操作它们吗?如何操作?谢谢我不完全确定你在问什么。“视图”(read:template)是一个不支持函数的无逻辑结构。您可以在数据到达视图之前(在
res.render()
之前)修改数据,也可以在客户端Javascript上修改数据。Java/C++的MVC编程思想(甚至类/对象/方法)并不能很好地转化为Javascript。express应用程序的基本结构通常是:获取请求(
app.Get()
)->处理请求(从数据库获取数据)->渲染到客户端(作为HTML或JSON)。更多研究:Handlebar支持,它允许您定义一些可以对模板中的数据执行的功能。Express 3/EJS允许您定义模板中可用的或。Michael,感谢您的输入。您是否介意详细介绍一下“添加一个间接级别,在该级别中,您有一个脚本,该脚本将您的模型打包为所有模板都知道的标准对象格式”?对我来说,这是缺失的部分。我可以想象这只是一个脚本(可能是
model transform.js
?),其中包含一个导出函数,将数据作为参数,然后简单地将它们移动到需要的地方并将其吐出