Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
Node.js 无法在函数中直接访问NodeJS Express app.locals_Node.js_Templates_Express_Scope_Ejs - Fatal编程技术网

Node.js 无法在函数中直接访问NodeJS Express app.locals

Node.js 无法在函数中直接访问NodeJS Express app.locals,node.js,templates,express,scope,ejs,Node.js,Templates,Express,Scope,Ejs,这是一个奇怪的问题,但请跟我来。我有一个带有express应用程序的nodejs服务器。在应用程序中,我将我的本地设置如下: var moment = require('moment'); app.locals.moment = moment; ejs呈现为: exports.page = function (req, res) { res.render('first-page'); }; 然后,在我的ejs中,我有以下代码: <% if (!moment) { thr

这是一个奇怪的问题,但请跟我来。我有一个带有express应用程序的nodejs服务器。在应用程序中,我将我的本地设置如下:

var moment = require('moment');
app.locals.moment = moment;
ejs呈现为:

exports.page = function (req, res) {
    res.render('first-page');
};
然后,在我的ejs中,我有以下代码:

<%
if (!moment) {
    throw new Error('moment is not defined');
}
function formatDate(date) {
     return moment(date).format();
}
%>
<p><%= formatDate(1435856054045); %></p>

我的问题是ejs中定义的函数是如何确定作用域的,以及应用于它们的上下文。ejs是否对函数应用了与浮动javascript不同的上下文?我假设它执行类似于
formatDateFunctionPointer.call(ejscope,…)的操作

当您有
ejs
输出生成的函数(编译了模板)时,问题变得很清楚:

问题是您的
formatDate
函数被提升到
块的外部;在该块中,
moment
实际上是
locals.moment
,因此您可以测试它是否存在

但是,当您可以
formatDate
时,它不会在
with
块的上下文中运行,因此,
时刻不存在(但是
局部变量。时刻不存在,正如您已经发现的那样)

下面是一个独立的问题示例:

var obj = { test : 123 };
with (obj) {
  if (test !== 123) throw new Error('test does not equal 123');
  function showTest() {
    console.log('test', test);
  }
  showTest();
}
解决此问题的一种方法是使用函数表达式:

<%
if (typeof moment === 'undefined') {
  throw new Error('moment is not defined');
}
var formatDate = function(date) {
  return moment(date).format();
};
%>
<p><%= formatDate(1435856054045); %></p>

(它还修复了您的测试,以查看是否实际定义了
时刻


或者您可以将EJS选项设置为
false

Sweet,谢谢。有道理。发布的代码只是我真实代码的简化,但你把重要部分说得非常清楚!
var obj = { test : 123 };
with (obj) {
  if (test !== 123) throw new Error('test does not equal 123');
  function showTest() {
    console.log('test', test);
  }
  showTest();
}
<%
if (typeof moment === 'undefined') {
  throw new Error('moment is not defined');
}
var formatDate = function(date) {
  return moment(date).format();
};
%>
<p><%= formatDate(1435856054045); %></p>