Cómo importar datos del file CSV a la colección Meteor en el lado del server

Estoy tratando de encontrar una solución para mi publicación anterior: Mongo da error key duplicado en _id_ campo en la aplicación Meteor

Para hacer eso, quiero leer los datos de mi file CSV en el server, y no desde el cliente.

Primero probé la solución en esta publicación Usar node-csv y meteor-file para importar CSV a una colección, pero meteor-file ya no es compatible con la versión actual de Meteor. También probé la solución en esta publicación Subir datos a Meteor / Mongo DB, pero también está en el cliente y esa solución genera el mismo error que en mi publicación anterior.

Después de algunas investigaciones adicionales intenté leer los datos con el siguiente código. Sin embargo, no funciona:

Primero creé una colección:

Meteor.orders = new Meteor.Collection('Orders'); 

Definí la siguiente plantilla para leer el file csv:

 <template name="read_file_orders"> <form class="well form-inline"> <label class="control-label" for="fileInput2">Kies bestand</label> <input class="input-file" id="fileInput2" type="file" name="files[]"> <Button class="btn btn-primary" id="read_orders">Importeer</button> <button class="btn btn-danger" id="erase_orders">Wis gegevens</button> </form> </template> 

Este es el javascript del cliente:

 Template.read_file_orders.events({ "click #read_orders" : function(e) { var f = document.getElementById('fileInput2').files[0]; console.log("read file"); readFile(f, function(content) { Meteor.call('upload',content); }); } }); readFile = function(f,onLoadCallback) { var reader = new FileReader(); reader.onload = function (e){ var contents=e.target.result onLoadCallback(contents); } reader.readAsText(f); }; 

Y este es el server javascript:

 Meteor.startup(function () { // code to run on server at startup return Meteor.methods({ upload : function(fileContent) { console.log("start insert"); import_file_orders(fileContent); console.log("completed"); } }); }); import_file_orders = function(file) { var lines = file.split('%\r\n'); var l = lines.length - 1; for (var i=0; i < l; i++) { var line = lines[i]; var line_parts = line.split('|'); var ex_key = line_parts[0]; var ex_name = line_parts[1]; var clin_info = line_parts[2]; var order_info = line_parts[3]; var clinician_last_name = line_parts[4]; var clinician_first_name = line_parts[5]; var clinician_code = line_parts[6]; var clinician_riziv = line_parts[7] var pat_id = line_parts[8]; Meteor.orders.insert({Patient:pat_id, Exam_code:ex_key, Exam_name:ex_name, Clinical_info:clin_info, Order_info:order_info, Clinician_first:clinician_first_name, Clinician_last:clinician_last_name, Clinician_c_code:clinician_code, Clinician_riziv:clinician_riziv, Planned:null}); console.log("%"); }; 

Cuando trato de leer el file, no pasa nada. Solo los loggings de la console aparecen en la console del server pero no se importa nada. Incluso la colección Orders no se crea.

Está claro que estoy haciendo algo mal, pero no sé exactamente qué hacer. Sin embargo, creo que la solución no está demasiado lejos. ¿Tal vez alguien de ustedes puede mostrarme la dirección correcta?

Saludos cordiales

EDITAR:

Para la respuesta de revmen, aquí está el código completo de mi testapp:

test.html:

 <head> <title>test</title> </head> <body> <h1>Welcome to Meteor!</h1> {{> read_file_orders}} </body> <template name="read_file_orders"> <form class="well form-inline"> <label class="control-label" for="fileInput2">Kies bestand</label> <input class="input-file" id="fileInput2" type="file" name="files[]"> <Button class="btn btn-primary" id="read_orders">Importeer</button> <button class="btn btn-danger" id="erase_orders">Wis gegevens</button> </form> </template> 

test.js

 Orders = new Mongo.Collection("orders"); if (Meteor.isClient) { // counter starts at 0 Template.read_file_orders.events({ "click #read_orders" : function(e) { var f = document.getElementById('fileInput2').files[0]; console.log("read file"); readFile(f, function(content) { Meteor.call('upload',content); }); } }); import_file_orders = function(file) { console.log("enter function import_file_orders") var lines = file.split(/\r\n|\n/); var l = lines.length - 1; for (var i=0; i < l; i++) { var line = lines[i]; var line_parts = line.split(','); var ex_key = line_parts[0]; var ex_name = line_parts[1]; var clin_info = line_parts[2]; var order_info = line_parts[3]; var clinician_last_name = line_parts[4]; var clinician_first_name = line_parts[5]; var clinician_code = line_parts[6]; var clinician_riziv = line_parts[7] var pat_id = line_parts[8]; var result = Orders.insert({Patient:pat_id, Exam_code:ex_key, Exam_name:ex_name, Clinical_info:clin_info, Order_info:order_info, Clinician:{first:clinician_first_name, last:clinician_last_name, c_code:clinician_code, riziv:clinician_riziv}, Planned:null}); console.log(Orders.findOne(result)); }; } readFile = function(f,onLoadCallback) { //When the file is loaded the callback is called with the contents as a string var reader = new FileReader(); reader.onload = function (e){ var contents=e.target.result onLoadCallback(contents); } reader.readAsText(f); }; } if (Meteor.isServer) { Meteor.startup(function () { // code to run on server at startup }); Meteor.methods({ upload : function(fileContent) { console.log("start insert"); import_file_orders(fileContent); console.log("completed"); } }); } 

Estabas muy cerca. Solo tuve que hacer algunos cambios para que funcione.

No sé cómo se ve tu file .csv, así que hice uno que es así:

 A1, B1, C1, D1, E1, F1, G1, H1, I1 A2, B2, C2, D2, E2, F2, G2, H2, I2 

Su operación file.split no estaba dividiendo las líneas, sino que estaba poniendo todo en una línea grande. Lo hice de esta manera y funcionó:

 var lines = file.split(/\r\n|\n/); 

Eso hizo que las líneas individuales se dividan en miembros de la matriz. Luego asumí que, como llamas a tu input un CSV, tus valores están separados por comas, no por tuberías. Así que cambié tu line.split a esto

 var line_parts = line.split(','); 

Es posible que otros cambios que realicé no sean lo que estaba causando el error de los tuyos, pero así es como creo que las cosas normalmente se hacen …

En lugar de declarar tu colección como esta

 Meteor.orders = new Meteor.Collection('Orders'); 

Lo hice así

 Orders = new Mongo.Collection("orders"); 

Tenga en count que esto lo ejecutan el server y el cliente.

En lugar de su forma de declarar methods en el server, simplemente pongo esto en el código del server (no en Meteor.start):

 Meteor.methods({ upload : function(fileContent) { console.log("start insert"); import_file_orders(fileContent); console.log("completed"); } }); 

Y, por supuesto, cambié la línea de inserción en la parte inferior de su function import_file_orders

 var result = Orders.insert({Patient:pat_id, Exam_code:ex_key, Exam_name:ex_name, Clinical_info:clin_info, Order_info:order_info, Clinician_first:clinician_first_name, Clinician_last:clinician_last_name, Clinician_c_code:clinician_code, Clinician_riziv:clinician_riziv, Planned:null}); console.log(Orders.findOne(result)); 

EDIT para el código actualizado en la pregunta:

Mueva la function import_file_orders del bloque del cliente al bloque del server.