Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all articles
Browse latest Browse all 14821

新手在使用 mongoose + js-xlsx 读取.xlsx文件并保存时遇到的一些问题

$
0
0

因需要读取excel文件并存进Mongodb,所以用了js-xlsx来操作excel文件,以下是我的代码:

var XLSX = require('xlsx')
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/demo')
var Data = require('./dataModel')
var url = 'demo.xlsx'
function readExcelFile(url){
    var jsonData = []
    var workbook = XLSX.readFile(url)
    var sheetNames = workbook.SheetNames
    var sheets = workbook.Sheets
    var count = 0
    sheetNames.forEach(function(name){
        var sheet = sheets[name]
        if(!isEmptyObject(sheet)){
            var json = XLSX.utils.sheet_to_json(sheet)
            json.forEach(function(item){
                var data = new Data(item)
                data.save(function(err){
                    if(err){
                        console.log('保存失败!')
                        console.log(err)
                        return
                    }
                    console.log(item)
                    console.log('保存成功!')
                })
            })
            jsonData = jsonData.concat(json)
        }
    })
    return jsonData
}
readExcelFile(url)
mongoose.disconnect(function(err){
    if(err){
        console.log(err)
    }
    console.log('断开数据库连接...')
})
function isEmptyObject(e) {  
    var t;  
    for (t in e)  
        return !1;  
    return !0  
} 

这段代码是可以满足需求,但是控制台的最先输出的是 “断开数据库连接…”,然后才输出的是保存记录,一开始我想的是这输出记录的语句是在回调函数中,所以后输出。然后因需要操作.csv文件,我使用了ya-csv这个模块,以下是我的代码:

var csv = require('ya-csv');
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/demo');
var DataModel = require('./dataModel');

function readfile(url){
	var reader = csv.createCsvFileReader(url, {columnsFromHeader:true, 'separator': ','});
	reader.on('data', function(data){
		var record = new DataModel(data);
		record.save(function(err){
						if(err){
							console.log('保存失败!');
							console.log(err);
							return;
						}
						console.log(record);
						console.log('保存成功!');
					});
	});
	reader.on('end', function(){
		console.log('Mission Complete!');
	});
	reader.on('error',function(){
		console.log('Mission Failed...');
	});
}

readfile('demo.csv');
mongoose.disconnect(function(err){
	if(err){
			console.log(err);
		}
		console.log('断开数据库连接...');
	});

基本思路和之前一样,但是这次虽然读取到了文件内容,但是无法保存进数据库中,若我不断开数据库连接,是可以成功保存的。难道是由于非阻塞式 I/O的原因数据库先于保存操作断开了(或者是更先于reader监听的data?)? 在操作excel文件是数据库断开的方法先于信息保存的回调方法执行的,为什么能保存成功?回调函数能保存数据库连接?对于这断开数据库的点我后来选择放到了reader监听的end中了,但此次遇到的问题还是很困扰,而且一般项目中,比如利用express生成的一个应用,应用中数据库一般是一直连接着吗?感觉断开的点不太好确定,会遇到类似这次的问题。小白对于很多还是不能理解,希望大神能给点指点。


Viewing all articles
Browse latest Browse all 14821

Trending Articles