2017-01-26 54 views
1

我想在基本的Meteor應用程序中使用IronRouter和Meteor-SSR進行服務器端渲染。當我在瀏覽器中我得到以下錯誤加載/home流星SSR「錯誤:無法呈現undefined」

Error: Can't render undefined 
    at checkRenderContent (packages/blaze.js:702:11) 
    at contentAsView (packages/blaze.js:724:3) 
    at Blaze.toHTML (packages/blaze.js:851:40) 
    at Object.SSR.render (packages/meteorhacks_ssr.js:208:10) 
    at [object Object].Router.route.where (main.js:9:20) 
    at boundNext (packages/iron_middleware-stack.js:408:31) 
    at runWithEnvironment (packages/meteor.js:1176:24) 
    at packages/meteor.js:1189:14 
    at [object Object].urlencodedParser (/Users/roger/.meteor/packages/iron_router/.1.1.1.1q7cd8x++os+web.browser+web.cordova/npm/node_modules1/body-parser/lib/types/urlencoded.js:84:40) 
    at packages/iron_router.js:886:36 

下面是應用程序的代碼:

// main.js 

if (Meteor.isServer) { 
    Router.route('/home', function() { 
    let html = SSR.render('home'); 
    this.response.end(html); 
    }, {where: 'server'}); 
} 

if (Meteor.isClient) { 
    Router.route('/home', function() { 
    this.render("home") 
    }); 
} 

這裏的main.html

<head> 
    <title>SSR Test</title> 
</head> 
<body> 
</body> 

<template name="home"> 
    Home 
</template> 

回答

1

這是因爲你的home模板沒有在服務器上定義。要使用SSR軟件包,您需要首先使用SSR.compileTemplate在服務器中編譯模板,然後才能使用SSR.render進行渲染。這是一個簡單的例子給你:

if (Meteor.isServer) { 
    const template = 'Hello {{username}}, <br> Now time is: {{time}}'; 
    SSR.compileTemplate('hello', template); 

    Router.route('/home', function() { 
    const html = SSR.render('hello', { 
     username: 'foo', 
     time: new Date(), 
    }); 

    this.response.end(html); 
    }, {where: 'server'}); 
} 

還有一個更好的從服務器上靜態文件,該文件可以發現here

+0

感謝編譯模板。有沒有辦法輕鬆加載已經在main.html中定義的模板? meteor-ssr的文檔說:「以前,這個軟件包會在您的應用程序啓動時加載所有客戶端模板,但現在流星不允許我們這樣做,所以這種行爲已被刪除。」有什麼方法可以實現這種行爲? –