#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
.