【问题标题】:How to respond server-side to routes using Meteor and Iron-Router?如何使用 Meteor 和 Iron-Router 在服务器端响应路由?
【发布时间】:2013-09-03 20:47:05
【问题描述】:

我正在使用 XHR 从客户端向服务器端发送文件:

$(document).on('drop', function(dropEvent) {
    dropEvent.preventDefault();
    _.each(dropEvent.originalEvent.dataTransfer.files, function(file) {
        // ...
        xhr.open('POST', Router.routes['upload'].path(), true);
        xhr.send(file);
    });
})

现在我想响应这个 POST 服务器端并将文件保存到磁盘。 The docs 似乎只谈论在客户端处理事情;我什至不知道如何在服务器端上钩。

我现在所拥有的路线是这样的:

Router.map(function() {
    this.route('home', {
        path: '/'
    });

    this.route('upload', {
        path: '/upload',
        action: function() {
            console.log('I never fire');
        }
    });
});

有了connect,我可以做到:

Connect.middleware.router(function(route) {
    route.post('/upload', function(req, res) {
        // my server-side code here
    });
});

Iron-Router 有类似的吗?


深入研究内部,我发现 Meteor 在后台使用 connect,我可以这样做:

WebApp.connectHandlers.use(function(req, res, next) {
    if(req.method === 'POST' && req.url === '/upload') {
        res.writeHead(200);
        res.end();
    } else next();
});

但我不知道如何在这种情况下获得用户。

【问题讨论】:

  • 刚刚注意到this comment。也许它甚至没有实现.....那么铁路由器有什么替代品?

标签: meteor iron-router


【解决方案1】:

默认情况下,您的路由创建为客户端路由。这意味着,指向该路由的链接将在浏览器中处理,而不是发出服务器请求。但是您也可以通过为路由提供where 选项来创建服务器端路由。服务器端路由的处理程序公开了Connect 对象的requestresponsenext 属性。从 0.5.4 到 dev 分支的语法略有变化,因此我将根据您使用的情况提供这两个示例:

v0.5.4

Router.map(function () {
  this.route('upload', {
    where: 'server',
    handler: function () {
      var request = this.request;
      var response = this.response;
      // do whatever
    }
  });
});

开发

Router.map(function () {
  this.route('upload', {
    where: 'server',
    action: function () {
      var request = this.request;
      var response = this.response;
      // do whatever
    }
  });
});

【讨论】:

  • 我可以在这种情况下获得Meteor user 吗?并访问数据库?
  • 不会设置 Meteor 用户,因为您不再在 DDP 级别进行交易。我还没有想到一个好的方法来做到这一点。可能是我将与核心团队一起讨论的事情。同时,对于文件上传,我一直在使用 DDP 来使用流星文件包:github.com/EventedMind/meteor-file。需要浏览器上的 HTML5 File API。
【解决方案2】:

您可以使用 EJSON 和普通流星​​“方法”上传文件,这样您就可以访问用户数据,因为它仅在服务器端的方法和发布函数中可见

此视频教程可能是good start

还包CollectionFS 提供了一些上传功能。它现在有点过时了,但想法保持不变。

【讨论】:

  • 这些解决方案是否允许您获取上传进度?使用 XHR,我可以有一个进度条;上次我查看流星方法时,它试图在一大块中完成整个事情,除非已经更新。编辑:collectionFS 听起来确实如此。即使是下载...整洁!
【解决方案3】:

给你带来iron-router的人也有meteor-file,它会为你做文件传输,或者你可以作为你自己实现的例子

【讨论】:

    【解决方案4】:

    Meteor Router(现已弃用)支持服务器端路由:

    Meteor.Router.add('/upload', 'POST', function() {
      // do stuff
    });
    

    【讨论】:

    • 你不能在一个项目中使用路由器和铁路由器——或者更确切地说,它没有那么简单。
    • 是的,你不能,但是有一个关于 Iron Router 替代品的问题。
    • 为什么不呢?我在一个项目中同时使用它们,我不需要做任何特别的事情。我使用 Iron Router 进行客户端路由,使用 Meteor Router 进行服务器端。
    • 我们同时使用两者。不过,我们正在远离 Meteor Router。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2015-03-14
    • 1970-01-01
    • 2018-03-20
    • 2016-08-26
    • 2013-12-09
    相关资源
    最近更新 更多