Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将函数与express.js一起使用;“本地人”;_Javascript_Node.js_Express - Fatal编程技术网

Javascript 将函数与express.js一起使用;“本地人”;

Javascript 将函数与express.js一起使用;“本地人”;,javascript,node.js,express,Javascript,Node.js,Express,来自Rails/Sinatra的背景,如果不能在我的视图文件中使用helper函数,我会感到很不自在,但是在express.js中实现这一点是相当困难的 您可以像这样设置为自动包含 app.set("name", "Adam's App"); 然后在视图文件中,访问变量非常简单: <!-- views/template.ejs --> <title><%= settings.name %></title> …但是调用不会执行函数(显然),更不用

来自Rails/Sinatra的背景,如果不能在我的视图文件中使用helper函数,我会感到很不自在,但是在express.js中实现这一点是相当困难的

您可以像这样设置为自动包含

app.set("name", "Adam's App");
然后在视图文件中,访问变量非常简单:

<!-- views/template.ejs -->
<title><%= settings.name %></title>
…但是调用
不会执行函数(显然),更不用说让我将
timestamp
参数传递给它了


我这样做对吗?

您可以在、和/或处设置视图变量

所以你可以把这些结合起来,做一些类似的事情:

app.locals.date_helper = function(ts) {
  return (new Date(ts)).toISOString();
});

app.get('/', function(req, res) {
  res.render('main', { timestamp: 1406809421643 });
});
然后在模板中:

日期是:

在一个半相关的注释中,您应该知道ejs使用了什么。

使用应用程序中间件

app.use((req, res, next) => {
    res.locals = {
        test: 'Sample Test',
        test_function: (name) => {
            return 'Hello ' + name;
        }
    }
    next();
});
在视图中,您可以使用

<%= test %> // output = " Sample test "
<%= test_function("Abdo") %> // output = " Hello Abdo"
//output=“示例测试”
//output=“你好,Abdo”

渲染时,是否尝试直接传递函数
.render('something',{settings:app.settings,helper:function(){…},function(err,stuff){…})沿着这些线ish@Deryck我不需要使用
设置:app.settings
(我想这在express 3.0中已经被弃用了?)。除此之外,我的目标是访问这些函数,而不必在
.render
块中指定它。在我定义的每一条路径中都必须使用
date\u helper:function(){..}
,这似乎是相当蹩脚的,同意吗?是的,我只是说作为一个故障排除选项,但下面的答案实际上已经有了。我本来打算推荐app.locals.date\u helper的作业,但看起来他的作业比我想说的要好。
app.set(x)
app.locals.x
做的事情不完全一样吗?您可能可以使用它,但是您必须在视图中执行类似于
settings.date\u helper(timestamp)
的操作
app.set()
/
app.get()
/
settings
通常应仅用于应用程序设置,而不是添加帮助程序和其他类似的视图特定内容。Mhmmm。假设您有一个要设置帮助函数的对象:
var helpers={date\u helper:function(){…},name\u helper:function(){…}
。如果我们循环对象中的每个kv对来设置每个kv对,是否可以使用
app.locals
来设置它们?我目前使用
app.set
使用:
object.keys(helpers).forEach(函数(helper){app.set(helper,helpers[helper])是的,您可以为
app.locals
执行类似的操作:
对象.keys(helpers).forEach(函数(helper){app.locals[helper]=helpers[helper]})
<%= test %> // output = " Sample test "
<%= test_function("Abdo") %> // output = " Hello Abdo"