Загрузка и обработка нескольких файлов в node.js API

#javascript #node.js #api #file #express

#javascript #node.js #API #файл #экспресс

Вопрос:

Я новичок в nodejs и, допустим, мне нужно загрузить несколько текстовых файлов в таком формате в конечную точку nodejs (их общий объем может составлять 200 МБ).:

 AU Olsen, BI
   Lund, NW
   Ellingsen, G
   Hartvigsen, G
PY 2012
ER

AU Ming, X
   Hajid, H
PY 2012
ER
 

Что я хочу сделать, так это прочитать эти файлы и сгенерировать массив объектов, которые будут возвращены в ответе, что-то вроде этого:

публикации = [{«автор»: [«Олсен, БИ», «Лунд, Северо-Запад», «Эллингсен, Джи», «Хартвигсен, Джи»],»Год публикации»: «2012»},{«автор»: [«Минг, Х», «Хаджид, Х»],»Год публикации»:»2012}]

На данный момент я пытаюсь прочитать все файлы, которые были загружены в папку построчно, чтобы я мог добавить к переменной publications последнее, проблема в том, что переменная publications всегда в конечном итоге возвращается пустой, похоже, что все, что я делаю внутри IFS, ничего не делает, это, вероятно, асинхронный проблема с обратным вызовом, но я понятия не имею, как это исправить.

 const multer = require ('multer');
const lineReader = require('line-reader');
var fs = require('fs');

const upload = multer({dest: 'uploads/'})
const app = express();
app.use(express.static('public'));

app.post('/uploadAndProcess', upload.array('publications'),(req,res) => {
    var publications = [{}]
    fs.readdir('./uploads', (err, dir)=>{
        for(var i=0; i<dir.length; i  ){
            fileName = dir[i];
            lineReader.eachLine('./uploads/' fileName, function(line) {
                if(line.includes('ER')) {
                    //do something and add to publications variable
                }
                if(line.includes('PY')) {
                    //do something and add to publications variable
                }

            });
        }
      })
    return res.json({pub: publications});
});

app.listen(3001, () => console.log('App is listening...'));
 

Есть какие-нибудь мысли? Спасибо!

РЕДАКТИРОВАТЬ: пробовал с помощью sync readdir и все равно не сработал: (

 app.post('/uploadAndProcess', upload.array('publications'),(req,res) => {
   var publications = [{}]
   var files = fs.readdirSync('./uploads');
   for(var file in files) {
       lineReader.eachLine('./uploads/' files[file], function(line) {
           if(line.includes('ER')) {
               publications.push({'test':'test'})
           }
       });
   };
   return res.json({pub: publications});
});
 

Ответ №1:

Я думаю, что вы на правильном пути с идеей асинхронного обратного вызова. Я предполагаю, что ответ отправляется до завершения обратного fs.readdir вызова, поскольку fs.readdir он является асинхронным, а чтение файла, как правило, является дорогостоящей операцией. Попробуйте использовать fs.readdirSync функцию для их синхронной обработки и посмотрите, работает ли она! Вот ссылка на документацию по узлу, чтобы вы могли начать.

Комментарии:

1. к сожалению, это не сработало (см. Отредактированный пост), есть мысли?

2. Что lineReader вы используете? lineReader.eachLine Также является асинхронным? readdirSync возвращает список строк, представляющих имя файла, поэтому './uploads/' files[file] выглядит подозрительно. Наверное, просто нужно './uploads/' file .