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 个片段:

  1. 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' }

  2. '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 的电子书。几天的阅读真的让我加快了速度!