Javascript 从事件更新反应变量

Javascript 从事件更新反应变量,javascript,node.js,mongodb,meteor,Javascript,Node.js,Mongodb,Meteor,我正在使用 Template.uploadFile.events({ 'change .set-file': function ( event, template ) { var file = event.currentTarget.files[0]; [...] } }); 上传文件时 我想读取文件中的每一行,并将每一行作为文档插入到集合中 问题是,我想反应性地向用户显示已经创建了多少行 首先,我需要将文件中的行数设置为一个变量。我必须在我的事件中设置变量,因为我只

我正在使用

Template.uploadFile.events({
  'change .set-file': function ( event, template ) {
    var file = event.currentTarget.files[0];

    [...]
  }
});
上传文件时

我想读取文件中的每一行,并将每一行作为文档插入到集合中

问题是,我想反应性地向用户显示已经创建了多少行

首先,我需要将文件中的行数设置为一个变量。我必须在我的事件中设置变量,因为我只知道读取文件后的行数(即触发事件)

我想我得做点什么

Template.uploadFile.helpers( {
  numRows: function () {
    return ?;
  },
  numInsertedRows: function () {
    return ?;
  },
} );
插入行数可以是我的集合中的文档数;然而,我想在我插入收藏的同时阅读收藏中的内容是相当需要记忆的

所以我认为最好只使用普通变量,因为所有信息都应该是可用的,而不需要询问数据库

我有一个循环

rowsInFile.forEach( function ( row ) {
    // add 1 to number of inserted rows
} );
但是这个循环也应该改变一个反应变量


我想我应该使用反应变量。我说得对吗?这是最节省内存的方法吗?

你可能把事情复杂化了。只需
count()
集合中的文档:

Template.uploadFile.helpers({
  numRows: function(){
    return myCollection.find({}).count();
  }
});

假设您可以编写一个查询来可靠地查找插入的数字,则可以对其执行相同的操作。否则,您可以在循环中增加一个会话或响应变量并返回它。

我不会从客户端插入行,而是在服务器上获取文件本身并在那里处理它。主要原因是,如果用户在操作过程中断开连接或关闭浏览器窗口,浏览器窗口将被剪切,并且可能很难再次干净地应用它。我如何才能做到这一点?这听起来比在客户端上做更吸引人。预期的数据文件有多大?将数据作为字符串数组发送到服务器是否可行?如果预计它不会太大,最简单的选择(到目前为止)是通过一种方法来实现。您可能应该提供更多关于您正在执行的处理类型的信息。它实际上是一个非常大的文件。我想将文件中的每一行(可能是10.000行)插入到一个集合中,因此我想直接在服务器上而不是通过客户端执行此操作更好。我最终可以使用papa parse来解析csv文件,并获得一个要插入的行数组。好吧,这对于一个SO问题来说太宽泛了,但如果它是经常使用的东西(所以您不能通过直接控制台或其他方式手动完成一次或两次),我将从以下组合开始:
CollectionFS
或另一种上传机制,用于将文件发送到服务器,用于服务器端批量插入,以及
raix:eventemitter
用于进度报告。