如何在没有收集任何数据的情况下在 Iron Router 中执行基于 URL 的功能?

How to execute function based on URL in Iron Router without any data from collection?

如何根据Session.set路由而不保存任何数据到集合?例如,用户向某个站点输入 URL。

'submit #form': function (event, template) {
    event.preventDefault();
    var url = template.find('#input').value;
    if (url)
        Session.set('url', url);
}

如果我们想基于 URL 执行函数,那么路由文件会是什么样子呢?让我们说:

www.example.com/download?url=http://youtube.com

并根据来自 URL?

的输入执行函数

我不喜欢我目前的做法。在我看来太复杂如下:

Template.formButton.events({
  'submit #form': function (event, template) {
    event.preventDefault();
    var url = template.find('#input').value;
    if (url)
        var linkId = Link.insert({
          url: url,
        });
        var route = {_id:linkId};
        Router.go('download', route);
  }
});
this.route('download', {
  path: '/download/:_id',
  where: 'client',
  data: function() {
    return Link.findOne(this.params._id);
  },
  onBeforeAction: function() {
    var data = this.data();
    if (data)
      var url = data.url;
      console.log(url);
      Meteor.call(getUrl, url, function(error, result) {
        console.log(result)
        this.next();
      });
  }
});

正如 MasterAM 所说,只需 url 编码您的 url 并将其直接提供给您的路线,但作为查询参数,而不是路径组件:

模板:

Template.formButton.events({
  'submit #form': function (event, template) {
    event.preventDefault();
    var url = template.find('#input').value;
    if (url)
        Router.go('download?url=' + encodeURIComponent(url));
  }
});

路由器:

this.route('download', {
  path: '/download',
  onBeforeAction: function() {
      var url = decodeURIComponent(this.params.query.url);
      console.log(url);
      Meteor.call(getUrl, url, function(error, result) {
        console.log(result)
        this.next();
      });
  }
});