我正在尝试在基本的Meteor应用程序中使用IronRouter和Meteor-SSR获得服务器端渲染。在浏览器中加载/home时,出现以下错误:

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>

最佳答案

发生这种情况是因为您的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

关于node.js - meteor SSR“错误:无法呈现未定义”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41864533/

10-09 17:26