【问题标题】:SailsJS Not Passing Data To View TemplateSailsJS 不将数据传递给查看模板
【发布时间】:2017-06-12 22:36:49
【问题描述】:

我已经在这里待了好几个小时,但似乎无法建立联系。

我只是想将一些数据从控制器传递到视图模板。如果我在没有声明视图模板的情况下运行路由,那么浏览器会将 JSON 格式的数据返回给浏览器(所以我知道 MYSQL 连接良好)。

每当我尝试连接到 MYSLQ 数据(或来自控制器以查看的任何数据)以传递给模板时,我在 Sails 中收到一个错误,提示找不到数据(我知道这不是真的因为我只要返回 JSON 数据就可以看到)。我假设这与 SailsJS 尝试连接到 EJS 模板引擎的方式有关,或者后端的模型、控制器和视图之间没有连接?

这里只是一个简单的例子,不起作用,但最后我试图连接到一个MYSQL数据列表。

Routes.js 声明:

'GET /schools': { view: 'schools/index', controller: "SchoolsController", action:"index"},

SchoolsController.js

module.exports = {
 index: function(req, res){
    //Just return this to the view
    res.view({
        "name": "Iparra"
    })
 }
};

index.ejs 模板

<div id="theschools">
 <h1>List of Schools</h1>
  <%= name %>
</div>

我从 Sails.js 得到的错误

{
    "stack": "ReferenceError: /Users/mnelson/Documents/Mike Files 2/Personal/MyDesign Musings/sails/test-project/views/schools/index.ejs:7\n    5|       <h1>List of Schools</h1>\n    6| \n >> 7|     <%= name %>\n    8| \n    9| </div>\n    10| \n\nname is not defined\n    at eval (eval at <anonymous> (/usr/local/lib/node_modules/sails/node_modules/ejs-locals/node_modules/ejs/lib/ejs.js:237:14), <anonymous>:30:109)\n    at eval (eval at <anonymous> (/usr/local/lib/node_modules/sails/node_modules/ejs-locals/node_modules/ejs/lib/ejs.js:237:14), <anonymous>:30:137)\n    at /usr/local/lib/node_modules/sails/node_modules/ejs-locals/node_modules/ejs/lib/ejs.js:250:15\n    at Object.exports.render (/usr/local/lib/node_modules/sails/node_modules/ejs-locals/node_modules/ejs/lib/ejs.js:288:13)\n    at Object.exports.renderFile (/usr/local/lib/node_modules/sails/node_modules/ejs-locals/node_modules/ejs/lib/ejs.js:318:20)\n    at SailsView.module.exports [as engine] (/usr/local/lib/node_modules/sails/node_modules/ejs-locals/index.js:85:7)\n    at SailsView.View.render (/usr/local/lib/node_modules/sails/node_modules/@sailshq/express/lib/view.js:76:8)\n    at Function.app.render (/usr/local/lib/node_modules/sails/node_modules/@sailshq/express/lib/application.js:561:10)\n    at ServerResponse.res.render (/usr/local/lib/node_modules/sails/node_modules/@sailshq/express/lib/response.js:845:7)\n    at ServerResponse.res.view (/usr/local/lib/node_modules/sails/lib/hooks/views/res.view.js:284:16)\n    at serveView (/usr/local/lib/node_modules/sails/lib/hooks/views/onRoute.js:61:20)\n    at routeTargetFnWrapper (/usr/local/lib/node_modules/sails/lib/router/bind.js:181:5)\n    at callbacks (/usr/local/lib/node_modules/sails/node_modules/@sailshq/express/lib/router/index.js:164:37)\n    at param (/usr/local/lib/node_modules/sails/node_modules/@sailshq/express/lib/router/index.js:138:11)\n    at pass (/usr/local/lib/node_modules/sails/node_modules/@sailshq/express/lib/router/index.js:145:5)\n    at nextRoute (/usr/local/lib/node_modules/sails/node_modules/@sailshq/express/lib/router/index.js:100:7)\n    at callbacks (/usr/local/lib/node_modules/sails/node_modules/@sailshq/express/lib/router/index.js:167:11)\n    at module.exports (/usr/local/lib/node_modules/sails/lib/hooks/cors/clear-headers.js:14:3)\n    at routeTargetFnWrapper (/usr/local/lib/node_modules/sails/lib/router/bind.js:181:5)\n    at callbacks (/usr/local/lib/node_modules/sails/node_modules/@sailshq/express/lib/router/index.js:164:37)\n    at param (/usr/local/lib/node_modules/sails/node_modules/@sailshq/express/lib/router/index.js:138:11)\n    at pass (/usr/local/lib/node_modules/sails/node_modules/@sailshq/express/lib/router/index.js:145:5)",
  "message": "/Users/mnelson/Documents/Mike Files 2/Personal/My Design Musings/sails/test-project/views/schools/index.ejs:7\n    5|       <h1>List of Schools</h1>\n    6| \n >> 7|     <%= name %>\n    8| \n    9| </div>\n    10| \n\nname is not defined",
  "path": "/Users/mnelson/Documents/Mike Files 2/Personal/My Design Musings/sails/test-project/views/schools/index.ejs"
}

【问题讨论】:

    标签: javascript mysql templates sails.js


    【解决方案1】:

    问题在于您的路线。从

    中删除 view: 'schools/index'
    'GET /schools': { view: 'schools/index', controller: "SchoolsController", action:"index"},
    

    或者直接改成

    'GET /schools': { 'SchoolsController.index' },
    

    为什么?

    在路由中,您必须指定要执行的控制器操作或要呈现的视图(如果是静态页面)

    res.view 将可选的第一个参数作为视图路径(相对于views/),如果未发送,它将默认呈现&lt;contollerName&gt;/&lt;actionName&gt; 视图。

    【讨论】:

    • 谢谢你!它没有解决问题,但它让我走上了正确的道路,对数据、视图和路由的连接方式进行排序。欣赏!
    【解决方案2】:

    在翻阅文档并查看其他 Github 示例的同时,我终于对其进行了整理。 Sujan 让我走上了正确的道路,但这并没有解决问题。它会返回数据,但它没有与视图耦合。这是我更新的内容,现在将整个数据列表拉入其中。我必须明确地使用数据返回视图。我不确定这是否是它应该在 Sails 中的方式,但这就是让它发挥作用的原因。似乎路线应该处理这个问题,但事实并非如此。

    控制器文件:

    module.exports = {
        index: function(req, res){
          Schools.find().exec(function afterFind(err, schools) {
            if (err) return res.serverError(err);
            console.log(schools);
            return res.view('schools/index', {
              theschools: schools
            });
          });
        }
    };
    

    路由文件:

    'GET /schools': {controller: 'SchoolsController', action:'index'},
    

    另外,我需要更新配置中的 blueprints.js 文件以取消对 find 方法的限制。

    defaultLimit: Number.MAX_VALUE
    

    我还将模板引擎更新为 pug。这是视图文件,index.pug

    extends ../layout
    
    block body
      #theschools
        h1
        |  List of Schools
      p
      table.table
        tr
          th ID
          th Name
          th City
          th Country
        each school in theschools
          tr
            td= school.SID
            td= school.schoolName
            td= school.schoolCity
            td= school.schoolCountry
    

    查看此 Stackoverflow 问题和答案的答案帮助我删除了控制器中的显式视图声明。 Custom view/action/controller not working in Sails JS

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多