1

我正在使用 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 服务器端并将文件保存到磁盘。文档似乎只谈论在客户端处理事情;我什至不知道如何在服务器端挂上钩子。

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

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有类似的东西吗?


深入研究内部结构,我发现 Meteorconnect在幕后使用,我可以做这样的事情:

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

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

4

4 回答 4

5

默认情况下,您的路由被创建为客户端路由。这意味着,指向该路由的链接将在浏览器中处理,而不是发出服务器请求。但是您也可以通过为路由提供where选项来创建服务器端路由。服务器端路由的处理程序公开对象的requestresponsenext属性Connect。语法从 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
    }
  });
});
于 2013-09-25T06:43:02.297 回答
1

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

于 2014-05-07T18:22:38.673 回答
1

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

这个视频教程可能是一个好的开始

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

于 2013-08-31T14:06:58.087 回答
0

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

Meteor.Router.add('/upload', 'POST', function() {
  // do stuff
});
于 2013-08-31T08:08:14.987 回答