2016-01-31 2 views
0

Я пытаюсь использовать babyParse для преобразования объекта JSON в CSV и вывода результирующего формата csv в файл в системе.Невозможно использовать PapaParse 'unparse' для преобразования JSON в CSV

module.exports.downloadItemCsv = function(req, res){ 
    Item.find({}) 
     .sort({date:-1}) 
     .exec(function(err, allItems){ 
      if(err){ 
       res.error(err) 
      } else{ 

       var configuration = { 
        quotes: false, 
        delimiter: ",", 
        newline: "\r\n" 
       }; 

       console.log(allItems); 
       console.log("Adding items to object."); 
       var csv = baby.unparse(allItems, configuration); 

       var targetPath = path.join(__dirname,"../../uploads/" + "newFile01"); 

       fs.writeFile(targetPath, csv, function(err){ 
        if(err){ 
         console.log("Write complete!") 
        } 
       }); 

       console.log("The file was saved!"); 
       res.json({status: 200}) 
      } 
     }) 
}; 

console.log(allItems); выводит правильный объект JSON, но, когда я делаю console.log для переменной CSV, вывод, что, как представляется, страница функций от ребенка Разбирают модули.

Насколько я могу судить в документации PapaParse, мне просто нужно передать объект JSON в строку var csv = baby.unparse(allItems, configuration);.

Как только у меня есть данные unparse в переменной «csv», я должен иметь возможность затем записать csv в файл. Кто-нибудь знает, почему объект JSON не подвергается анализу объекту csv?

Ниже то, что данные в allItems выглядит следующим образом:

[ { __v: 0, 
    itemId: 2507, 
    item: 'TEST', 
    description: 'TEST', 
    brand: 'TEST', 
    category: 'TEST', 
    subcategory: 'TEST', 
    size: '10', 
    gender: 'F', 
    costPrice: 10, 
    salePrice: 10, 
    saleDate: '2016-01-31', 
    purchaseDate: '2016-01-31', 
    _id: 56ae7972049ce640150453b7 } ] 

Ниже приводится Exert результата заселенного в переменный «CSV». Полный результат - большой, чтобы поставить ниже.

$__,isNew,errors,_doc,$__original_save,save,_pres,_posts,db,discriminators,__v,id,_id,purchaseDate,saleDate,salePrice,costPrice,gender,size,subcategory,category,brand,description,item,itemId,schema,collection,$__handleSave,$__save,$__delta,$__version,increment,$__where,remove,model,on,once,emit,listeners,removeListener,setMaxListeners,removeAllListeners,addListener,$__buildDoc,init,$__storeShard,hook,pre,post,removePre,removePost,_lazySetupHooks,update,set,$__shouldModify,$__set,getValue,setValue,get,$__path,markModified,modifiedPaths,isModified,$isDefault,isDirectModified,isInit,isSelected,validate,$__validate,validateSync,invalidate,$markValid,$isValid,$__reset,$__dirty,$__setSchema,$__getArrayPathsToValidate,$__getAllSubdocs,$__registerHooksFromSchema,$__handleReject,$toObject,toObject,toJSON,inspect,toString,equals,populate,execPopulate,populated,depopulate,$__fullPath 
[object Object],false,,[object Object],"function() { 
     var self = this 
     , hookArgs // arguments eventually passed to the hook - are mutable 
     , lastArg = arguments[arguments.length-1] 
     , pres = this._pres[name] 
     , posts = this._posts[name] 
     , _total = pres.length 
     , _current = -1 
     , _asyncsLeft = proto[name].numAsyncPres 
     , _asyncsDone = function(err) { 
      if (err) { 
       return handleError(err); 
      } 
      --_asyncsLeft || _done.apply(self, hookArgs); 
      } 
     , handleError = function(err) { 
      if ('function' == typeof lastArg) 
       return lastArg(err); 
      if (errorCb) return errorCb.call(self, err); 
      throw err; 

ответ

2

Проблема связана с allItems быть коллекция Mongoose документов, а не обычный Javascript объектов. Вы можете преобразует эти объекты с помощью .toObject() или просто добавить опцию lean к вашему запросу:

module.exports.downloadItemCsv = function(req, res){ 
    Item.find({}) 
     .sort({date:-1}) 
     .lean() 
     .exec(function(err, allItems){ 

     ... 
    }); 
}; 
+0

Привет Cviejo, спасибо за выше обратной связи; Я испытаю это позже сегодня. Можете ли вы рассказать мне, почему проблема не была очевидна при регистрации «allItems» на консоли? Как правило, я знаю, с чем я работаю. Было бы хорошо понять, почему это не дает истинной картины. – ricky89

+1

Несомненно. Короче говоря: 'console.log' будет распечатывать результат любой реализации' toString() 'этого конкретного объекта. Поэтому внутренне, когда вы вызываете 'toString()' в документе mongoose, он отделяет все соответствующие данные от методов и свойств мангуста и возвращает их. Эта библиотека, которую вы используете, 'babyparse' /' papaparse', анализирует объект и не может определить, какие свойства связаны с мангустом или нет, это неожиданный вывод, который вы видите. – cviejo

+0

Добавление '.lean()' работало как шарм. Благодарим вас за недостающую часть/объяснение, лежащее в ее основе. – ricky89

Смежные вопросы