我有一个包含40,000行的简单CSV文件,我使用papa-parse处理浏览器端。
我尝试使用Discover Meteor中的技术以及Google搜索中找到的其他101个帖子将它们逐个插入到集合中。
40000很快插入浏览器端 - 但是当我检查mongo服务器端时,它只有387条记录。
最终(通常在20秒左右)后开始插入服务器端。 但是如果我关闭或中断浏览器,已经插入的记录显然会消失。
如何强制插入服务器端,或至少监控,以便知道何时通知用户成功?
我试过Tracker.flush()没什么区别。
我在Meteor.method中进行服务器端插入,但所有服务器端CSV库的操作都比客户端更复杂(我初学者几乎所有的编程:)
谢谢!
这是我的代码的主要部分(在客户端文件夹中):
Template.hello.events({
"submit form": function (event) {
event.preventDefault();
var reader = new FileReader();
reader.onload = function (event) {
var csv = Papa.parse(this.result, {header: true});
var count = 0;
_.forEach(csv.data, function (csvPerson) {
count++;
Person.insert(csvPerson);
console.log('Inserting: ' + count + ' -> ' + csvPerson.FirstName);
});
};
reader.readAsText(event.target[0].files[0]);
}
});
控制台输出的最后几行:
Inserting: 39997 -> Joan
Inserting: 39998 -> Sydnee
Inserting: 39999 -> Yael
Inserting: 40000 -> Kirk
最后几行CSV(随机生成的数据):
Jescie,Ayala,27/10/82,"P.O. Box 289, 5336 Tristique Road",Dandenong,7903,VI,mus.Proin@gravida.co.uk
Joan,Petersen,01/09/61,299-1763 Aliquam Rd.,Sydney,1637,NS,sollicitudin@Donectempor.ca
Sydnee,Oliver,30/07/13,Ap #648-5619 Aliquam Av.,Albury,1084,NS,Nam@rutrumlorem.ca
Yael,Barton,30/12/66,521 Auctor. Rd.,South Perth,2343,WA,non.cursus.non@etcommodo.co.uk
Kirk,Camacho,25/09/08,"Ap #454-7701 A, Road",Stirling,3121,WA,dictum.eu@morbitristiquesenectus.com
hello模板显然是一个简单的表单,只是文件选择和提交。 客户端代码位于客户端目录下。 在应用程序根目录中定义的人员。 CSV现在解析为字符串,以避免复杂性。 插入的记录看起来很好,按名称检索,无论如何。
控制台中的Person.find()。count()浏览器结果为40000。
很高兴发送只有1.5MB的文件及其随机数据 - 不敏感。
答案 0 :(得分:0)
我认为call()应该如下工作:
在客户端
Meteor.call("insertMethod",csvPerson);
服务器端的方法
insertMethod: function(csvPerson){
Person.insert(csvPerson);
}
答案 1 :(得分:0)
在Meteor中,在某些情况下,如果您没有通过回调,操作将同步。
如果在服务器上运行代码Person.insert(csvPerson);
,则操作将同步而不是异步。根据您的目的,您将来可能会遇到严重问题。在客户端,它不会同步,而是异步。
由于node.js是基于事件的服务器,因此单个同步操作可以暂停整个系统。你真的要做你的同步操作。
对于导入数据,最好的选择是在服务器端Meteor.startup(function(){ //import code goes here})
内进行。
Sindis提出的解决方案有效,但速度很慢,如果浏览器关闭(由于某种原因),则不会跟踪已插入的记录。如果您使用Meteor.call("insertMethod",csvPerson);
,此操作将在客户端上同步。
初学者场景中的最佳选择(非最佳)是:
1- While(您有要插入的记录)
2-在没有回叫的情况下调用Meteor.call
3-计算集合中所有插入的字段
4-将此值保存到localStorage
5-返回步骤1
这假设每次插入尝试的插入顺序相同。如果浏览器失败,您始终可以从localStorage获取值并跳过该数量的记录。