2015-07-02 45 views
1

這是一個奇怪的問題,但跟着我一起。我有一個具有快速應用程序的nodejs服務器。在應用程序中,設置我的當地人如下:NodeJS Express app.locals不能直接訪問功能

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說這個時刻沒有在formatDate中定義,引發了一個異常。如果我將formatDate更改爲以下內容,則一切正常。

function formatDate(date) { 
    return locals.moment(date).format(); 
} 

我的問題是如何在ejs中定義的函數作用域和應用於它們的上下文。 ejs是否對浮動javascript應用了不同的上下文?我假設它時,你有ejs輸出生成的功能(作爲一個模板編譯)像formatDateFunctionPointer.call(ejsScope, ...);

回答

2

問題變得清晰:

with (locals || {}) { 
    if (!moment) { 
     throw new Error('moment is not defined'); 
    } 
    function formatDate(date) { 
    return moment(date).format(); 
    } 
    ... 
} 

的問題是,你的formatDate功能懸掛到with區塊之外; 裏面那個塊,moment實際上是locals.moment,所以你的測試看看它是否存在有效。

但是,當你可以formatDate,這不是with塊的上下文中運行,因此,moment不存在(但locals.moment呢,因爲你已經發現了)。

這裏的問題的一個獨立的例子:解決此問題是使用函數表達式

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> 

(也修復您的測試,看看moment實際上是定義)

或者您可以將EJS _with選項設置爲false

+0

甜,謝謝。說得通。發佈的代碼僅僅是我真實的代碼的一個簡化,但是你非常清楚的重要部分! – Vadym