使用Express和Node将json文件发送到pug模板

时间:2017-11-18 15:53:41

标签: javascript json node.js express pug

请原谅我,但我仍然有点新鲜表达。我有一个运行简单主页的哈巴狗模板。在同一台服务器上,我有一个包含事件列表的json文件。我想将此json文件中的数据发送到pug模板并在div中迭代它。我用fs加载文件,lodash map将它映射到一个数组。我已经为pug文件创建了路由,但我不知道如何将两者连接在一起,即将我的fs函数中创建的数组传递给jade路由。到目前为止我有以下

var file = __dirname + '/events.json';
fs.readFile(file, 'utf8', function (err, data) {
if (err) {
  console.log('Error: ' + err);
  return;
}

var data = JSON.parse(data);

var newEventList = data.events.map(events => ({
    id: events.id ,
    name: events.name ,
    venue: events.place.name ,
    address: events.place.location.street + " " + events.place.location.city + " " + events.place.location.zip ,
    coverPicture: events.coverPicture ,
    description: events.description ,
    startTime: events.startTime ,
    endTime: events.endTime
 }));
});


app.get('/', function (req, res) {
 res.render('index', { title: 'Hey', message: 'Hello there!', 
   newEventList })
  })

有人能指出我正确的方向吗?目前我

ReferenceError: newEventList is not defined

所以我想我需要一种方法让路由看到newEventList数组。谢谢。

1 个答案:

答案 0 :(得分:2)

您正在做的事情不起作用,因为:

a)在回复data

的回调中,您没有对readFile参数做任何事情。

b)node.js是异步的,因此解析数据以及app.get将在回调完成之前运行

一个很好的简单解决方案就是替换所有这些:

var file = __dirname + '/events.json';
fs.readFile(file, 'utf8', function (err, data) {
if (err) {
  console.log('Error: ' + err);
  return;
}

var data = require('./events.json') 

将同步运行,以便变量data始终可用。

或者,如果您出于任何原因(为了练习和理解或其他原因)想要使用fs,则需要在回调app.get('/')内完成所有这些操作。并将您获得的数据分配给内部回调中的变量。

希望有道理吗?