node——underscore的使用
我在做新闻页面时,需要将之前存好点的data.json里的数据显示在首页上,而首页的每条新闻数据不能直接写定在上面,所以我们要将data里面的数据传递进去。我们需要使用underscore的template函数。
之前在underscore的简单了解中已经讲过template了,接下来就直接用
1.首先我们要在首页的响应代码里面找到data.json,将它存进list_news数组里面
fs.readFile(path.join(__dirname,'data','data.json'),'utf8',function(err,data){ //因为第一次访问网站,data.json文件本身就不存在,所以会有异常 //这种错误,我们不认为是网站出错了,所以不需要抛出异常 if(err&&err.code!=='ENOENT'){ throw err; } //如果data没有读取到,则data为空,转换为数组 var list_news=JSON.parse(data||'[]'); });
这段代码之前写过了
2.然后我们需要渲染html文件,在以前写过一个res.render函数,渲染时传入html文件路径
fs.readFile(path.join(__dirname,'data','data.json'),'utf8',function(err,data){ if(err&&err.code!=='ENOENT'){ throw err; } var list_news=JSON.parse(data||'[]'); res.render(path.join(__dirname,'views','home.html')); });
但是现在还需要传入list_news,就需要在修改res,render函数
res.render=function(filename,tqData){ fs.readFile(filename,function(err,data){ if(err) { res.writeHead(404,'Not Found',{'Content-Type':'text/html;charset=utf-8'}); res.end('44,not found'); return; } if(tqData){ //如果用户传递了模板数据,表示模板要替换,否则不替换 //因为data是二进制,模板是字符串,所以要将data转换为字符串 // data=_.template(data.toString('utf8'))(tqData); //上面的代码和下面的代码等价 var fn=_.template(data.toString('utf8')); data=fn(tqData); } res.end(data); }) }
在使用时:
if(req.url==='/'||req.url==='/index'&&req.method==='get') { //1.读取data.json文件中的数据,并将读取到的数据转化为list_news数组 fs.readFile(path.join(__dirname,'data','data.json'),'utf8',function(err,data){ if(err&&err.code!=='ENOENT'){ throw err; } var list_news=JSON.parse(data||'[]'); //2.在服务器端使用模板引擎,将list中的数据和index.html文件中的内容结合,渲染给客户端 res.render(path.join(__dirname,'views','home.html'),{list:list_news});//这里要传一个叫list的对象 }); }