这个问题针对任何具有烧瓶(python)和sailsjs知识的人。我对Web框架等概念很陌生。我开始使用烧瓶,但现在我必须使用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 和 mydata 的模板。
在帆中,我对如何使用给定参数定义路线感到困惑。我明白了:
'/': {
view: 'companies'
}
但我不知道如何使路线动态化以接受任何变量 org_name 。
另一个问题是在python中, mydata 是来自MySQL数据库的查询。我有完全相同的数据库连接到Sailsjs,但我确信这个模型没用。我正在创建的网站不会生成任何新数据(即我既不会更新也不会将新数据保存到数据库中。)
因此我的问题是:
'/company/:org_name': {
view: 'companies'
}
我应该在哪里创建过滤数据库的函数?我应该如何确定sails会将org_name参数传递给函数,以及如何将数据作为参数传递给html模板?
非常感谢。
答案 0 :(得分:1)
这里有2个选项,但它有助于解释每个选项,以便您选择最佳的行动方案。
首先,路线......您确实可以直接从路线渲染视图,但您也可以做其他一些事情。以下是来自sails.js网站文档的两个片段:
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});
});
}
在从帆文档中剪切的第二部分中,您可以看到提到的“本地人”。在GET隐私路线中,我们看到视图被告知是否使用布局模板。然而,话虽如此,没有什么可以阻止你更多地进入当地人,如用户名等。
在我看来,我觉得这是最好的做法,我会让你的routes.js变得非常薄和无逻辑,将数据库查询/逻辑/重定向放入你的控制器。
对于您的具体示例:
我的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%>
如果您需要任何进一步的帮助/澄清,请告知我们。我建议你看一下sails.js文档,但是如果你真的想了解一下我推荐的sails.js在Action中这是一个来自mannings的电子书。几天的阅读真的让我加快了速度!