SailsJS 没有将数据传递给视图模板
SailsJS Not Passing Data To View Template
我已经在这里工作了几个小时,但似乎无法建立联系。
我只是想将一些数据从控制器传递到视图模板。如果我 运行 没有声明视图模板的路由,那么浏览器 return 将 JSON 形式的数据发送给浏览器(所以我知道 MYSQL 连接是好的) .
每当我尝试连接到 MYSLQ 数据(或来自控制器以查看的任何数据)以传递给模板时,我在 Sails 中收到一个错误,提示无法找到数据(我知道这是不正确,因为我可以在 return 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"
}
问题出在您的路线上。从
中删除 view: 'schools/index'
'GET /schools': { view: 'schools/index', controller: "SchoolsController", action:"index"},
或者直接改成
'GET /schools': { 'SchoolsController.index' },
为什么?
在路由中,您必须指定要执行的控制器操作或要呈现的视图(如果它是静态页面)
res.view
将可选的第一个参数作为视图路径(相对于 views/
),如果未发送,它将默认呈现 <contollerName>/<actionName>
视图。
在深入研究文档并查看其他 Github 示例时,我终于对它进行了整理。 Sujan 让我走上了正确的道路,但这并没有解决问题。它将 return 数据,但它没有与视图耦合。这是我更新的内容,现在将整个数据列表拉入。我必须明确地返回到包含数据的视图。我不确定这是否是 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 文件以消除对查找方法的限制。
defaultLimit: Number.MAX_VALUE
我也将模板引擎更新为哈巴狗。这是视图文件,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
查看这个 Whosebug 问题和答案的答案帮助我删除了控制器中的显式视图声明。
Custom view/action/controller not working in Sails JS
我已经在这里工作了几个小时,但似乎无法建立联系。
我只是想将一些数据从控制器传递到视图模板。如果我 运行 没有声明视图模板的路由,那么浏览器 return 将 JSON 形式的数据发送给浏览器(所以我知道 MYSQL 连接是好的) .
每当我尝试连接到 MYSLQ 数据(或来自控制器以查看的任何数据)以传递给模板时,我在 Sails 中收到一个错误,提示无法找到数据(我知道这是不正确,因为我可以在 return 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"
}
问题出在您的路线上。从
中删除view: 'schools/index'
'GET /schools': { view: 'schools/index', controller: "SchoolsController", action:"index"},
或者直接改成
'GET /schools': { 'SchoolsController.index' },
为什么?
在路由中,您必须指定要执行的控制器操作或要呈现的视图(如果它是静态页面)
res.view
将可选的第一个参数作为视图路径(相对于 views/
),如果未发送,它将默认呈现 <contollerName>/<actionName>
视图。
在深入研究文档并查看其他 Github 示例时,我终于对它进行了整理。 Sujan 让我走上了正确的道路,但这并没有解决问题。它将 return 数据,但它没有与视图耦合。这是我更新的内容,现在将整个数据列表拉入。我必须明确地返回到包含数据的视图。我不确定这是否是 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 文件以消除对查找方法的限制。
defaultLimit: Number.MAX_VALUE
我也将模板引擎更新为哈巴狗。这是视图文件,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
查看这个 Whosebug 问题和答案的答案帮助我删除了控制器中的显式视图声明。 Custom view/action/controller not working in Sails JS