Node.js 无法在函数中直接访问NodeJS Express app.locals
这是一个奇怪的问题,但请跟我来。我有一个带有express应用程序的nodejs服务器。在应用程序中,我将我的本地设置如下: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
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>