express的多重页面渲染问题

报错如下:

ReferenceError: /trunk\web\home\views\user\index.ejs:17
    15| <body>
    16| <style type="text/css">body{background: #fafafa;}</style>
 >> 17| <%-partial("../layout/top_nav.ejs",{data:{hasLogin:hasLogin,memberInfo:memberInfo}})%>
    18| <%-partial("../layout/user_header.ejs",{data:{}})%>
    19| <div class="wrap1200">
    20|  <div class="ce_mainbox mt30 clx">

/trunk\web\home\views\index.ejs:16
    14| 
    15| <div class="topbanner">
 >> 16|   <div class="im"><img src="<%=indexBannerImage%>"/></div>
    17| </div>
    18| <%-partial("layout/top_nav.ejs",{data:{hasLogin:hasLogin,memberInfo:memberInfo}})%>
    19| <%-partial("layout/header.ejs",{data:{MenuData:topMenuList,CurrentMenu:"index"}})%>

indexBannerImage is not defined
    at eval (eval at <anonymous> (/trunk\web\home\node_modules\ejs\lib\ejs.js:464:12), <anonymous>:33:23)
    at returnedFn (/trunk\web\home\node_modules\ejs\lib\ejs.js:493:17)
    at exports.render (/trunk\web\home\node_modules\ejs\lib\ejs.js:315:37)
    at render (/trunk\web\home\node_modules\express-partials\index.js:325:25)
    at ServerResponse.partial (/trunk\web\home\node_modules\express-partials\index.js:365:12)
    at eval (eval at <anonymous> (/trunk\web\home\node_modules\ejs\lib\ejs.js:464:12), <anonymous>:37:16)
    at returnedFn (/trunk\web\home\node_modules\ejs\lib\ejs.js:493:17)
    at View.exports.renderFile [as engine] (/trunk\web\home\node_modules\ejs\lib\ejs.js:350:31)
    at View.render (/trunk\web\home\node_modules\express\lib\view.js:126:8)
    at tryRender (/trunk\web\home\node_modules\express\lib\application.js:639:10)

其中是两个页面:

app.use('/', routes);
app.use('/user', users);
app.use("/test",router_test);

其中首页定义路由规则:

router.get('/', function(req, res, next) {

会员中心相关页面:

router.get('/', function(req, res, next) {
  UserCenterService.getCommonPageData(req,function(commonData){
    //res.send(JSON.stringify(commonData));
    res.render('user/index.ejs', commonData);
  });
});

最后发现先匹配了/user这个路由,然后再渲染了/这个路由,因为首页的一些数据没有所有导致了错误。

根源调查

首先调查是不是express的路由问题:
新建一些文件用于测试:
这里写图片描述
两个路由文件分别如下:

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
    console.log("index");
    res.send('hello,this is index test -- index');
});

module.exports = router;
var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
    console.log("user");
    res.send('hello,this is user  test -- index');
});

module.exports = router;

在app.js里面注册路由:

app.use("/",router_index_test);
app.use("/user",router_user_test);

每次都重启一下nodejs的服务器,分别访问两个地址,查看相关数据。

这里写图片描述
这里写图片描述

而user路径如下:
这里写图片描述
这里写图片描述

阶段结论

可以认为路由相关匹配正常,同一个路由规则,action不会执行两次,那么,问题在哪?

添加ejs模板然后再测试

分别添加两个ejs模板:
这里写图片描述
里面的内容如下:

<h1><%=indexData.title%></h1>
<h2><%=indexData.message%></h2>
<h1><%=userData.title%></h1>
<h2><%=userData.message%></h2>

分别给action添加渲染的代码,渲染一下:

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
    console.log("index");
    //res.send('hello,this is index test -- index');
    res.render('test/index_test.ejs', {indexData:{title:"i am index",message:"this is index message"}});
});

module.exports = router;
var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
    console.log("user");
    //res.send('hello,this is user  test -- index');
    res.render('test/user_test.ejs', {userData:{title:"i am user",message:"this is user message"}});
});

module.exports = router;

好了,测试一下:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

阶段结论

无问题。

第三次测试,结合异步进行测试

最后发现

这里写图片描述

stackflow的说法

I have a page ./views/account/index.ejs that has a partial included from ./views/account/edit.ejs -- but I get an error that "path must be a string" when I call it from ./account/index.ejs

<%- partial('edit.ejs') %>
I'm using express 3.x and express-partials

If I include a partial that is at the base ./views/edit.ejs it works. How do I include a partial in a subdirectory? I tried <%- partial('account/edit') %> but it does not work.

1
down vote
I’ve got the same issue. I’ve fixed it inside the express-partials module and made a pull request - https://github.com/publicclass/express-partials/pull/19.

So just install the latest module version and you are done.

shareimprove this answer
answered Oct 4 ‘12 at 8:50

ecdeveloper
1,0621212

Fix partial include of a view in a subfolder #2 #19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值