2015-04-25 41 views
0

在PHP中,我曾經使用output buffering to cache the output並將其另存爲html文件。我想知道是否可以在node.js中完成相同的操作。以下是我的路由文件:是否有可能將node.js視圖輸出緩存爲html文件?

module.exports = { 

index: function(section,page,req,res){ 
    var l = res.locals, 

    db = l.db, 

    Promise = l.Promise, 

    Promise.props({ 

     my: db.db.query('CALL fetchdata()'), 

     amba: db.db.query("CALL fetchanother()") 
    }).then(function(obj){ 

     return res.render(section+'.html',obj) 

    }).then(function(data){ 

     console.log(data); 

     l.fs.writeFile('index.html', data) 

    }).catch(function (error) { 

     console.log(error); 
    }) 
} 
}; 

return res.render(section+'.html',obj)不起作用。 console.log(data)在控制檯中返回「未定義」,並且該html文件除「單詞」之外沒有任何內容。我也試過這個:

.then(function(obj){ 
     var cache 
     res.render(section+'.html',obj,function(k,content){ 
      res.send(content) 
      cache = content 
     }) 
     return cache; 
    }).then(function(data){ 
     console.log(data); 
     l.fs.writeFile('index.html', data) 

    }) 

它仍然是未定義的。有沒有辦法將視圖結果緩存爲html文件?

+1

注意,快遞已經實現的觀點緩存,雖然它通常禁用用於開發 - ['「view cache」'選項](http://expressjs.com/4x/api.html#app.set)。 –

回答

1

在第一個片段中,dataundefined,因爲這是res.render(...)返回的值。

通常情況下(取決於確切的Promise實現),在.then()回調中返回的除另一個Promise以外的任何值都將被視爲分辨率值。所以,以下2個片段大致相同。

.then(function() { 
    return undefined; 
}) 
.then(function() { 
    return new Promise(function (resolve) { 
     resolve(undefined); 
    }); 
}) 

要接收html,因爲res.render()是異步的,不提供承諾本身,你會因此它在等着要包裝在一個承諾:

.then(function(obj){ 
    return new Promise(function (resolve, reject) { 
     res.render(section+'.html', obj, function (err, html) { 
      if (err) 
       reject(err); 
      else 
       resolve(html); 
     }); 
    }); 
}).then(function(data){ 
    // ... 

注意:上述代碼段與ES6 Promises兼容,如果您使用的是不同的實施方式,可能需要修改。


對於第2個片段中,有已經問答&一對SO有一個很好的解釋:

Why is my variable unaltered after I modify it inside of a function?

相關問題