Sailsjs 路由和模板渲染
Sailsjs route and template rendering
这个问题是针对同时具有 flask (python) 和 sailsjs 知识的任何人的。我对网络框架等概念非常陌生。我开始使用烧瓶,但现在我必须使用 Sailsjs。在烧瓶中,我可以将路线定义为:
@app.route('/company/<org_name>')
def myfunction(org_name):
...use org_name to filter my database and get data for that company...
return render_template('companies.html', org_name=org_name, mydata=mydata)
我可以在哪里使用 myfunction() 来呈现一个模板,我可以在其中传递参数 org_name 和 我的数据.
在航行中,我对如何使用给定参数定义我的路线感到困惑。我明白了:
'/': {
view: 'companies'
}
但我不确定如何使路由动态化以接受任何变量org_name.
另一个问题是在python中,mydata是来自MySQL数据库的查询。我有相同的数据库连接到 Sailsjs,模型已完全设置,但我确信这个模型是无用的。我正在创建的网站不会产生任何新数据(即我既不会更新也不会将新数据保存到数据库)。
我的问题是:
'/company/:org_name': {
view: 'companies'
}
我应该在哪里创建筛选数据库的函数?我应该如何确定 sails 会将 org_name 参数传递给函数,我应该如何将数据作为参数传递给 html 模板?
非常感谢。
这里有 2 个选项,但它有助于对每个选项进行一些解释,以便您选择最佳的行动方案。
首先,路线...您确实可以如您所示直接从路线渲染视图,但您也可以做一些其他事情。以下是 sails.js 网站文档中的 2 个片段:
module.exports.routes = {
'get /signup': { view: 'conversion/signup' },
'post /signup': 'AuthController.processSignup',
'get /login': { view: 'portal/login' },
'post /login': 'AuthController.processLogin',
'/logout': 'AuthController.logout',
'get /me': 'UserController.profile'
}
'get /privacy': {
view: 'users/privacy',
locals: {
layout: 'users'
}
},
片段 1 展示了如何直接呈现视图,以及如何指向控制器以执行一些更复杂的逻辑。
控制器中的登录可能意味着对于 /me "GET"
路由,您可以在 "profile" 方法中执行数据库查询以接受 get 参数,查找用户,然后显示视图内的用户数据。一个例子是:
Profile: function (req,res){
User.find({name: req.param('name')}.exec(function founduser(err,result){
return view('profile',{userdata: result});
});
}
在从 sails 文档中截取的第二个片段中,您可以看到提到了 "locals"。在 GET 隐私路由中,我们看到视图被告知是否使用布局模板。然而,话虽如此,没有什么能阻止你向当地人推销更多东西,比如用户名等。
在我看来,我认为最好的做法是,我会让你的 routes.js 变得非常单薄和无逻辑,将数据库 queries/logic/redirections 放入你的控制器中。
对于您的具体示例:
我的 routes.js 文件可能如下所示
// config/routes.js
module.exports.routes = {
'get /companies': 'CompanyController.index',
'get /companies/:orgname': 'CompanyController.company'
}
这允许第一个路由可能通过转到 /companies
来显示公司列表,而当基于单击公司名称发出获取请求时,我的第二个路由可能会触发,例如/companies/Siemens
我的 CompanyController.js 可能如下所示:
module.exports = {
index: function (req, res) {
return res.view('companieslist');
},
company: function (req, res) {
var companyName = req.param('orgname'); //Get the company name supplied
//My company model which could be in api/models as Company.js is used to find the company
Company.find({name: companyName}).limit(1).exec(function companyresult(err,result){
//Error catch
if(err){return res.negotiate(err)};
//The result of our query is pushed into the view as a local
return res.view('company',{companydata: result}); //Within the .find callback to ensure we keep async
});
}
};
在我看来,我可以访问 "companydata" 下检索到的数据,例如对于 EJS:
<%=companydata[0].name%>
如果您还需要 help/clarifications 请告诉我。我确实建议您查看 sails.js 文档,但如果您真的想了解一些事情,我推荐 sails.js in Action,这是一本来自 mannings 的电子书。几天的阅读真的让我加快了速度!
这个问题是针对同时具有 flask (python) 和 sailsjs 知识的任何人的。我对网络框架等概念非常陌生。我开始使用烧瓶,但现在我必须使用 Sailsjs。在烧瓶中,我可以将路线定义为:
@app.route('/company/<org_name>')
def myfunction(org_name):
...use org_name to filter my database and get data for that company...
return render_template('companies.html', org_name=org_name, mydata=mydata)
我可以在哪里使用 myfunction() 来呈现一个模板,我可以在其中传递参数 org_name 和 我的数据.
在航行中,我对如何使用给定参数定义我的路线感到困惑。我明白了:
'/': {
view: 'companies'
}
但我不确定如何使路由动态化以接受任何变量org_name.
另一个问题是在python中,mydata是来自MySQL数据库的查询。我有相同的数据库连接到 Sailsjs,模型已完全设置,但我确信这个模型是无用的。我正在创建的网站不会产生任何新数据(即我既不会更新也不会将新数据保存到数据库)。
我的问题是:
'/company/:org_name': {
view: 'companies'
}
我应该在哪里创建筛选数据库的函数?我应该如何确定 sails 会将 org_name 参数传递给函数,我应该如何将数据作为参数传递给 html 模板?
非常感谢。
这里有 2 个选项,但它有助于对每个选项进行一些解释,以便您选择最佳的行动方案。
首先,路线...您确实可以如您所示直接从路线渲染视图,但您也可以做一些其他事情。以下是 sails.js 网站文档中的 2 个片段:
module.exports.routes = { 'get /signup': { view: 'conversion/signup' }, 'post /signup': 'AuthController.processSignup', 'get /login': { view: 'portal/login' }, 'post /login': 'AuthController.processLogin', '/logout': 'AuthController.logout', 'get /me': 'UserController.profile' }
'get /privacy': { view: 'users/privacy', locals: { layout: 'users' } },
片段 1 展示了如何直接呈现视图,以及如何指向控制器以执行一些更复杂的逻辑。
控制器中的登录可能意味着对于 /me "GET"
路由,您可以在 "profile" 方法中执行数据库查询以接受 get 参数,查找用户,然后显示视图内的用户数据。一个例子是:
Profile: function (req,res){
User.find({name: req.param('name')}.exec(function founduser(err,result){
return view('profile',{userdata: result});
});
}
在从 sails 文档中截取的第二个片段中,您可以看到提到了 "locals"。在 GET 隐私路由中,我们看到视图被告知是否使用布局模板。然而,话虽如此,没有什么能阻止你向当地人推销更多东西,比如用户名等。
在我看来,我认为最好的做法是,我会让你的 routes.js 变得非常单薄和无逻辑,将数据库 queries/logic/redirections 放入你的控制器中。
对于您的具体示例:
我的 routes.js 文件可能如下所示
// config/routes.js
module.exports.routes = {
'get /companies': 'CompanyController.index',
'get /companies/:orgname': 'CompanyController.company'
}
这允许第一个路由可能通过转到 /companies
来显示公司列表,而当基于单击公司名称发出获取请求时,我的第二个路由可能会触发,例如/companies/Siemens
我的 CompanyController.js 可能如下所示:
module.exports = {
index: function (req, res) {
return res.view('companieslist');
},
company: function (req, res) {
var companyName = req.param('orgname'); //Get the company name supplied
//My company model which could be in api/models as Company.js is used to find the company
Company.find({name: companyName}).limit(1).exec(function companyresult(err,result){
//Error catch
if(err){return res.negotiate(err)};
//The result of our query is pushed into the view as a local
return res.view('company',{companydata: result}); //Within the .find callback to ensure we keep async
});
}
};
在我看来,我可以访问 "companydata" 下检索到的数据,例如对于 EJS:
<%=companydata[0].name%>
如果您还需要 help/clarifications 请告诉我。我确实建议您查看 sails.js 文档,但如果您真的想了解一些事情,我推荐 sails.js in Action,这是一本来自 mannings 的电子书。几天的阅读真的让我加快了速度!