From 75c55040be80772c70194d5608fb405c2e47c702 Mon Sep 17 00:00:00 2001 From: xice Date: Sun, 27 May 2018 19:18:12 +0800 Subject: [PATCH] API finished --- package-lock.json | 90 ++++++++++++++ package.json | 1 + servers/.~lock.my.csv# | 1 + servers/app.js | 95 +++++++++++---- servers/my.csv | 7 ++ servers/sql.js | 266 ++++++++++++++++++++++++++++++++--------- servers/test.js | 10 ++ 7 files changed, 388 insertions(+), 82 deletions(-) create mode 100644 servers/.~lock.my.csv# create mode 100644 servers/my.csv create mode 100644 servers/test.js diff --git a/package-lock.json b/package-lock.json index c9fdcdf..d7ae19c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -206,6 +206,15 @@ "sprintf-js": "1.0.3" } }, + "arguments-extended": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/arguments-extended/-/arguments-extended-0.0.3.tgz", + "integrity": "sha1-YQfkkX0OtvCk3WYyD8Fa/HLvSUY=", + "requires": { + "extended": "0.0.6", + "is-extended": "0.0.10" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -230,6 +239,16 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, + "array-extended": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/array-extended/-/array-extended-0.0.11.tgz", + "integrity": "sha1-1xRK50jek8pybxIQCdv/FibRZL0=", + "requires": { + "arguments-extended": "0.0.3", + "extended": "0.0.6", + "is-extended": "0.0.10" + } + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -2791,6 +2810,16 @@ "whatwg-url": "6.4.1" } }, + "date-extended": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/date-extended/-/date-extended-0.0.6.tgz", + "integrity": "sha1-I4AtV90b94GIE/4MMuhRqG2iZ8k=", + "requires": { + "array-extended": "0.0.11", + "extended": "0.0.6", + "is-extended": "0.0.10" + } + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -2817,6 +2846,11 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "declare.js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/declare.js/-/declare.js-0.0.8.tgz", + "integrity": "sha1-BHit/5VkwAT1Hfc9i8E0AZ0o3N4=" + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -3715,6 +3749,22 @@ } } }, + "extended": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/extended/-/extended-0.0.6.tgz", + "integrity": "sha1-f7i/e52uOXWG5IVwrP1kLHjlBmk=", + "requires": { + "extender": "0.0.10" + } + }, + "extender": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/extender/-/extender-0.0.10.tgz", + "integrity": "sha1-WJwHSCvmGhRgttgfnCSqZ+jzJM0=", + "requires": { + "declare.js": "0.0.8" + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -3798,6 +3848,17 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, + "fast-csv": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-2.4.1.tgz", + "integrity": "sha1-vX3SaDkfcpNntZRFuN0K0CaIGyY=", + "requires": { + "extended": "0.0.6", + "is-extended": "0.0.10", + "object-extended": "0.0.7", + "string-extended": "0.0.8" + } + }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", @@ -5629,6 +5690,14 @@ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, + "is-extended": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/is-extended/-/is-extended-0.0.10.tgz", + "integrity": "sha1-JE4UDfdbscmjEG9BL/GC+1NKbWI=", + "requires": { + "extended": "0.0.6" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7893,6 +7962,16 @@ } } }, + "object-extended": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/object-extended/-/object-extended-0.0.7.tgz", + "integrity": "sha1-hP0j9WsVWCrrPoiwXLVdJDLWijM=", + "requires": { + "array-extended": "0.0.11", + "extended": "0.0.6", + "is-extended": "0.0.10" + } + }, "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", @@ -11730,6 +11809,17 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, + "string-extended": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/string-extended/-/string-extended-0.0.8.tgz", + "integrity": "sha1-dBlX3/SHsCcqee7FpE8jnubxfM0=", + "requires": { + "array-extended": "0.0.11", + "date-extended": "0.0.6", + "extended": "0.0.6", + "is-extended": "0.0.10" + } + }, "string-length": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", diff --git a/package.json b/package.json index f470a8d..5b5b92a 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "build": "node build/build.js" }, "dependencies": { + "fast-csv": "^2.4.1", "koa": "^2.5.1", "koa-body": "^1.7.0", "koa-compose": "^4.1.0", diff --git a/servers/.~lock.my.csv# b/servers/.~lock.my.csv# new file mode 100644 index 0000000..07b6770 --- /dev/null +++ b/servers/.~lock.my.csv# @@ -0,0 +1 @@ +,xice,xice-W65KJ1-KK1,27.05.2018 18:51,file:///home/xice/.config/libreoffice/4; \ No newline at end of file diff --git a/servers/app.js b/servers/app.js index 821b197..da8e9c2 100644 --- a/servers/app.js +++ b/servers/app.js @@ -3,23 +3,24 @@ let bodyParser = require('koa-body'); let route = require('koa-route'); const logger = require('koa-logger') const compose = require('koa-compose'); +let send = require('koa-send'); let db = require('./sql'); const app = new Koa(); -app.use(bodyParser({multipart: true})); +app.use(bodyParser({ multipart: true })); // app.use(async(ctx, next) => { // console.log(`Process ${ctx.request.method} ${ctx.request.url}...`); // await next(); // }) app.use(logger()); -app.use(async(ctx, next)=>{ - if(ctx.request.method == "POST"){ +app.use(async (ctx, next) => { + if (ctx.request.method == "POST") { // for(ctx.request.body in ctx.request.body); console.log(ctx.request.body); } await next(); }) -let getTitale = async(ctx,next)=>{ - ctx.response.body = JOSN.stringify({name:(await db.activity.get_tital(ctx.query['paper_id']))}); +let getTitale = async (ctx, next) => { + ctx.response.body = JOSN.stringify({ name: (await db.activity.get_tital(ctx.query['paper_id'])) }); } // start 返回问卷信息 开始计时 /** @@ -44,7 +45,7 @@ let getTitale = async(ctx,next)=>{ ] } */ -let start = async(ctx,next)=>{ +let start = async (ctx, next) => { let post = ctx.request.body; let paper_id = post.paper_id; delete post.paper_id; @@ -53,9 +54,9 @@ let start = async(ctx,next)=>{ ctx.session.activity_id = paper_id; ctx.session.start_time = new Date(); let rec = await db.activity.get_paper(paper_id); - if(rec == "time_err"){ - ctx.response.body=JSON.stringify({success:false,msg:"不在答题时间,不能答题"}); - }else{ + if (rec == "time_err") { + ctx.response.body = JSON.stringify({ success: false, msg: "不在答题时间,不能答题" }); + } else { ctx.response.body = JSON.stringify(rec); } } @@ -68,16 +69,16 @@ let start = async(ctx,next)=>{ msg: "您已经参加过","提交成功" } */ -let end = async(ctx,next)=>{ +let end = async (ctx, next) => { let post = ctx.request.body; let end_time = new Date(); - if(await db.activity.is_time_out( + if (await db.activity.is_time_out( ctx.session.activity_id, ctx.session.start_time, end_time - )){ - ctx.response.body = JSON.stringify({success: false,msg:"用时过分长"}); - }else{ + )) { + ctx.response.body = JSON.stringify({ success: false, msg: "用时过分长" }); + } else { let test_id = await db.test_paper.log_in(db.question, ctx.session.activity_id, ctx.session.user_id, @@ -85,20 +86,68 @@ let end = async(ctx,next)=>{ end_time, post ); - if(test_id == 'had'){ - ctx.response.body = JSON.stringify({success: false,msg:"已参加哦"}); - }else{ - await Promise.all([db.user.add_test(ctx.session.user_id,test_id), - db.activity.add_test(ctx.session.activity_idtest_id,test_id) + if (test_id == 'had') { + ctx.response.body = JSON.stringify({ success: false, msg: "已参加哦" }); + } else { + await Promise.all([db.user.add_test(ctx.session.user_id, test_id), + db.activity.add_test(ctx.session.activity_idtest_id, test_id) ]) - ctx.response.body = JSON.stringify({success: true,msg:"已成功提交"}); + ctx.response.body = JSON.stringify({ success: true, msg: "已成功提交" }); } } } +let admin_login = async (ctx, next) => { + let post = ctx.request.body; + let admin = await db.admin.is_login_in(post.user_name, post.password) + if (!admin === false) { + ctx.session.admin = true; + ctx.session.user_id = admin._id; + ctx.response.body = JSON.stringify({ success: true, activity_list: admin }); + } else { + ctx.session.admin = false; + ctx.response.body = JSON.stringify({ success: false }); + } +} +/* +name +start_time +end_time +time_lim +question_num + +file +type question A A.price B B.price +*/ +let admin_upload = async (ctx, next) => { + if (ctx.session.admin) { + let post = ctx.request.body.fields; + let file = ctx.request.body.files.file; + let admin = await db.admin.add_activity( + ctx.session.user_id, + await db.activity.new_a_activity(db.question, post, file) + ) + ctx.response.body = JSON.stringify({ success: true, activity_list: admin }); + } else { + ctx.response.body = "请勿越级"; + } + + +} +// activity_id +let admin_download = async (ctx,next)=>{ + if (ctx.session.admin) { + let path = await db.activity.get_fraction_out_put(db.test_paper,ctx.query["activity_id"]); + await send(ctx, path,{ root: '/' }); + } else { + ctx.response.body = "请勿越级"; + } +} app.use(compose([ - route.get('/api/getTital',getTitale), - route.post('/api/start',start), - route.post('/api/end',end) + route.get('/api/getTital', getTitale), + route.post('/api/start', start), + route.post('/api/end', end), + route.post('/api/adminLogin', admin_login), + route.post('/api/adminUpload', admin_upload) ])); app.listen(8083); console.log('app started at port 8083...'); \ No newline at end of file diff --git a/servers/my.csv b/servers/my.csv new file mode 100644 index 0000000..118f9e1 --- /dev/null +++ b/servers/my.csv @@ -0,0 +1,7 @@ +A +A,A,A +A,A,"A,b,c,d,s,e,d",A,A,A,A,A +A,A,"A,,,,",A,A,A,A,A,A,A,A,A +A,A,A,A,A,A,A,A,A,A,A,A,A,A,A, +A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A +A,A,A,A,A,A,A,A,A,A, diff --git a/servers/sql.js b/servers/sql.js index b5e44e6..7e38abc 100644 --- a/servers/sql.js +++ b/servers/sql.js @@ -1,5 +1,12 @@ let mongoose = require('mongoose'); +let csv = require('fast-csv'); +let fs = require('fs'); let Schema = mongoose.Schema; +let admin = new Schema({ + user_name: String, + password: String, + activity_list: [{ type: mongoose.Schema.ObjectId, ref: "activity" }] +}) let user = new Schema({ student_id: String, name: String, @@ -7,40 +14,78 @@ let user = new Schema({ user_class: String, telephone: String, user_ip: String, - test_list:[{type: mongoose.Schema.ObjectId, ref: "test_paper"}], + test_list: [{ type: mongoose.Schema.ObjectId, ref: "test_paper" }], }); let activity = new Schema({ name: String, strat_time: Date, end_time: Date, question_num: Number, - question_list: [{type: mongoose.Schema.ObjectId, ref: "question"}], + question_list: [{ type: mongoose.Schema.ObjectId, ref: "question" }], time_lim: Number, - contestant_paper_list: [{type: mongoose.Schema.ObjectId, ref: "test_paper"}], + contestant_paper_list: [{ type: mongoose.Schema.ObjectId, ref: "test_paper" }], }) let question = new Schema({ type: Number, problem: String, - answer:[{ + answer: [{ content: String, price: Number, - try_user_list:[{type: mongoose.Schema.ObjectId, ref: "user"}], + try_user_list: [{ type: mongoose.Schema.ObjectId, ref: "user" }], }] }) let test_paper = new Schema({ - user_id: {type: mongoose.Schema.ObjectId, ref: "user"}, - activity: {type: mongoose.Schema.ObjectId, ref: "activity"}, - question_list:[{type: mongoose.Schema.ObjectId, ref: "question"}], + user_id: { type: mongoose.Schema.ObjectId, ref: "user" }, + activity: { type: mongoose.Schema.ObjectId, ref: "activity" }, + question_list: [{ type: mongoose.Schema.ObjectId, ref: "question" }], answer: [String], time_start: Date, time_end: Date, fraction: Number, }) -user.statics.init_user = function(user){ - return new Promise((rec,rej)=>{ - this.findOne({telephone:user.telephone},async (err,rew)=>{ - if(err) console.log(err); - if(rew){ +admin.static.is_login_in = function (user_name, password) { + return new Promise((rec, rej) => { + this.findOne({ user_name: user_name }).populate('activity_list').exec((err, rew) => { + if (err) console.log(err); + if (rew && password == rew.password) { + let out = []; + for (it of rew.activity_list) { + out.push({ + activity_id: it._id, + name: it.name, + num: it.contestant_paper_list.length + }) + } + rec(out); + } else { + rec(false); + } + }) + }) +} +admin.static.add_activity = function (user_id, activity_id) { + return new Promise((rec, rej) => { + this.findById(user_id).exec(async (err, rew) => { + if (err) console.log(err); + rew.activity_list.push(activity_id); + await rew.save(); + let out = []; + for (it of rew.activity_list) { + out.push({ + activity_id: it._id, + name: it.name, + num: it.contestant_paper_list.length + }) + } + rec(out); + }) + }) +} +user.statics.init_user = function (user) { + return new Promise((rec, rej) => { + this.findOne({ telephone: user.telephone }, async (err, rew) => { + if (err) console.log(err); + if (rew) { rew.name = post.name; rew.student_id = post.student_id; rew.school = post.school; @@ -55,47 +100,47 @@ user.statics.init_user = function(user){ }) }) } -user.static.add_test = function(user_id,test_id){ - this.findById(user_id).exec(async(err,rew)=>{ - if(err)console.log(err); +user.static.add_test = function (user_id, test_id) { + this.findById(user_id).exec(async (err, rew) => { + if (err) console.log(err); rew.test_list.push(test_id); await rew.save(); rec(rew); }) } -activity.static.add_test = function(activity_id,test_id){ - this.findById(activity_id).exec(async(err,rew)=>{ - if(err)console.log(err); +activity.static.add_test = function (activity_id, test_id) { + this.findById(activity_id).exec(async (err, rew) => { + if (err) console.log(err); rew.contestant_paper_list.push(test_id); await rew.save(); rec(rew); }) } -activity.static.get_tital = function(activity_id){ - return new Promise((rec,rej)=>{ - this.findById(activity_id,(err,rew)=>{ - if(err)console.log(err); - if(rew){ +activity.static.get_tital = function (activity_id) { + return new Promise((rec, rej) => { + this.findById(activity_id, (err, rew) => { + if (err) console.log(err); + if (rew) { rec(rew.name); - }else{ + } else { rec('NULL'); } }) }) } -activity.static.get_paper = function(activity_id,no_time_lim = false){ - return new Promise((rec,rej)=>{ - this.findById(activity_id).populate('question_list').exec((err,rew)=>{ - if(err) console.log(err); +activity.static.get_paper = function (activity_id, no_time_lim = false) { + return new Promise((rec, rej) => { + this.findById(activity_id).populate('question_list').exec((err, rew) => { + if (err) console.log(err); let now = new Date(); - if((now < rew.end_time && now > rew.strat_time)||no_time_lim){ + if ((now < rew.end_time && now > rew.strat_time) || no_time_lim) { let question_list = rew.question_list; while (question_list.length > rew.question_num) { - question_list.splice(Math.floor(Math.random()*(question_list.length)),1); + question_list.splice(Math.floor(Math.random() * (question_list.length)), 1); } for (it of question_list) { for (at in it.answer) { - it.answer[a].num = at + it.answer.length * Math.floor(Math.random()*5000); + it.answer[a].num = at + it.answer.length * Math.floor(Math.random() * 5000); delete it.answer[a].price; delete it.answer[a].try_user_list; } @@ -106,44 +151,138 @@ activity.static.get_paper = function(activity_id,no_time_lim = false){ paper_id: rew._id, question_list: question_list }); - }else{ + } else { rec('time_err'); } }) }) } -activity.static.is_time_out = function(activity_id,strat_time,end_time){ - return new Promise((rec,rej)=>{ - this.findById(activity_id).exec((err,rew)=>{ - if(err)console.log(err); +activity.static.is_time_out = function (activity_id, strat_time, end_time) { + return new Promise((rec, rej) => { + this.findById(activity_id).exec((err, rew) => { + if (err) console.log(err); let use_time = end_time - strat_time / 1000; - if(rew.time_lim - use_time > -20){ + if (rew.time_lim - use_time > -20) { rec(false); - }else{ + } else { rec(true); } }) }) } -test_paper.static.log_in = function(question_db,activity_id,user_id,strat_time,end_time,post){ - return new Promise((rec,rej)=>{ - this.findOne({user_id: user_id,activity:activity_id}).exec(async(err,rew)=>{ - if(err)console.log(err); - if(rew){ +activity.static.new_a_activity = function (question_db, post, file) { + return new Promise((rec, rej) => { + let a_activity = new this({ + name: post.name, + strat_time: new Date(post.strat_time), + end_time: new Date(post.end_time), + question_num: post.question_num, + question_list: [], + time_lim: post.time_lim, + contestant_paper_list: [], + }) + let promise_list = []; + fs.createReadStream(file.path) + .pipe(csv()) + .on("data", (data) => { + if (data[3] != "A选项的分值") { + let out = { answer: [] }; + for (key in data) { + if (data[key] === '') { + if (key == 0) { + out.type = Number(data[key]); + } else if (key == 1) { + out.problem = data[key]; + } else { + if (key % 2 == 0) { + out.answer.push({ content: data[key], price: 0, try_user_list: [] }); + } else { + out.answer[parseInt(key / 2) - 1].price = Number(data[key]); + } + } + } + } + promise_list.push(question_db.add_question(out)); + } + }) + .on("end", async () => { + a_activity.question_list = await Promise.all(promise_list); + await a_activity.save(); + rec(a_activity._id); + }); + }) +} +// name student_id school user_class telephone fraction +activity.static.get_fraction_out_put = function (test_db, activity_id) { + return new Promise((rec, rej) => { + this.findById(activity_id).exec(async (err, rew) => { + if (err) console.log(err); + let promise_list = []; + for (i of rew.contestant_paper_list) { + promise_list.push(test_db.get_list_adout_fraction_csv(i)); + } + let out_put = await Promise.all(promise_list); + out_put.unshift("name,student_id,school,user,class,telephone,fraction"); + let random = new Promise((rec, rej) => { + require('crypto').randomBytes(32, function (ex, buf) { + var token = buf.toString('hex'); + rec(token); + }); + }) + let fileData = Buffer.from(out_put.join('\n')); + let path = '/tmp/' + (await random()) + '.csv' + let wstream = fs.createWriteStream(path); + wstream.on('open', () => { + const blockSize = 128; + const nbBlocks = Math.ceil(fileData.length / (blockSize)); + for (let i = 0; i < nbBlocks; i += 1) { + const currentBlock = fileData.slice( + blockSize * i, + Math.min(blockSize * (i + 1), fileData.length), + ); + wstream.write(currentBlock); + } + wstream.end(); + }); + wstream.on('finish', () => {rec(path);}); + }) + }) +} +test_paper.static.get_list_adout_fraction_csv = function (test_id) { + return new Promise((rec, rej) => { + this.findById(test_id).populate("user_id").exec((err, rew) => { + if (err) console.log(err); + let out = [ + rew.user_id.name, + rew.user_id.student_id, + rew.user_id.school, + rew.user_id.user_class, + rew.user_id.telephone, + rew.fraction + ]; + rec(out.join(',')); + }) + }) +} +test_paper.static.log_in = function (question_db, activity_id, user_id, strat_time, end_time, post) { + return new Promise((rec, rej) => { + this.findOne({ user_id: user_id, activity: activity_id }).exec(async (err, rew) => { + if (err) console.log(err); + if (rew) { rec("had"); - }else{ + } else { let a_test_paper = new this({ user_id: user_id, - activity:activity_id, - question_list:[], - answer:[], + activity: activity_id, + question_list: [], + answer: [], time_start: strat_time, time_end: end_time, fraction: 0 }) let promise_list = []; - for(a in post){ - promise_list.push(question_db.get_in_it(a,post[a],user_id)); + for (a in post) { + promise_list.push(question_db.get_in_it(a, post[a], user_id)); a_test_paper.answer.push(post[a]); a_test_paper.problem.push(a); } @@ -155,25 +294,34 @@ test_paper.static.log_in = function(question_db,activity_id,user_id,strat_time,e }) }) } -question.static.get_in_it = function(question_id,answer_num,user_id){ - return new Promise((rec,rej)=>{ - this.findById(question_id).exec((err,rew)=>{ - if(err) console.log(err); - if(rew.answer[answer_num%rew.answer.length].try_user_list.indexOf(user_id) == -1){ - rew.answer[answer_num%rew.answer.length].try_user_list.push(user_id); +question.static.get_in_it = function (question_id, answer_num, user_id) { + return new Promise((rec, rej) => { + this.findById(question_id).exec((err, rew) => { + if (err) console.log(err); + if (rew.answer[answer_num % rew.answer.length].try_user_list.indexOf(user_id) == -1) { + rew.answer[answer_num % rew.answer.length].try_user_list.push(user_id); } - rec(rew.answer[answer_num%rew.answer.length].price); + rec(rew.answer[answer_num % rew.answer.length].price); }) }) } +question.static.add_question = function (in_question) { + let a_new_question = new this(in_question); + return new Promise(async (rec, rej) => { + await a_new_question.save(); + rec(a_new_question._id); + }) +} mongoose.connect("mongodb://127.0.0.1:27017/question", { config: { autoIndex: false } }); +let admin_db = mongoose.model('admin', admin); let user_db = mongoose.model('user', user); let activity_db = mongoose.model('activity', activity); let question_db = mongoose.model('question', question); let test_paper_db = mongoose.model('test_paper', test_paper); -let cookie_db = mongoose.model('cookie',cookie); +let cookie_db = mongoose.model('cookie', cookie); -module.exports={ +module.exports = { + admin: admin_db, user: user_db, activity: activity_db, question: question_db, diff --git a/servers/test.js b/servers/test.js new file mode 100644 index 0000000..b7cf536 --- /dev/null +++ b/servers/test.js @@ -0,0 +1,10 @@ + let csv = require('fast-csv'); + let fs = require('fs'); +fs.createReadStream("my.csv") + .pipe(csv()) + .on("data", function(data){ + console.log(data); + }) + .on("end", function(){ + console.log("done"); + });