чтение файлов и чтение каталога в node.js

#node.js #amazon-s3 #callback #fs #async.js

Вопрос:

Я хочу знать, имеют ли функции чтения файла и чтения каталога — fs.readdir(путь, обратный вызов) и fs.ReadFile(путь, параметры, обратный вызов) аналогичные функции без обратного вызова.Здесь я сначала читаю все файлы в данном каталоге, просматриваю все файлы и загружаю их содержимое в корзину S3. Пожалуйста, ознакомьтесь с рабочим кодом ниже.

 const s3Upload = async (req, res) => {
  const directoryName = "MAXIS_GAMING/Daily/"
  var data = {}
  let files = {}
  await readFiles1(directoryName)
  }
  
  const readFiles1 = async(dirname) => {
    let _files
    fs.readdir(dirname, (err, files) => {
      // On error, show it and return
      if(err) return console.error(err);
    
      // files is an array containing the names of all entries
      // in the directory, excluding '.' (the directory itself)
      // and '..' (the parent directory).
    
      // Display directory entries
      console.log(files.join(' '));
      files.forEach(function(filename){
        fs.readFile(dirname   filename, 'utf-8', function(err, content){
          if(err) {
           // onError(err);
           throw err
            return;
          }
          console.log('cont..............................',content)
          console.log('filename', filename)
          //await 
          uploadFiles(filename, content)
          //onFileContent(filename, content);
        })
      })
  
    })
  
  }
  
  const uploadFiles = async (fileName, fileContent) => {
    console.log('in uploadd..........')
    const GLOBAL_ACCESS_KEY_ID = 'AKIDAQWZX6B3XUBDIFHLPC5LYFTJF15XPIQ';
    const GLOBAL_SECRET_ACCESS_KEY = 'Sv4Fe4h4QgErG5XoZbgeC63oczkdW3bMQfC0jvyR8bPbJ9Y97k '
    const GLOBAL_DEFAULT_REGION = 'ap-southeast-1';
    const S3_IMAGE_BUCKET ='max-stg-image/stage/reports'//"max-stg-image";
    const S3_IMAGE_PATH =  "stage";
      
    AWS.config.update({
          accessKeyId: GLOBAL_ACCESS_KEY_ID,
          secretAccessKey: GLOBAL_SECRET_ACCESS_KEY,
          region: GLOBAL_DEFAULT_REGION,
    });
      
    const s3 = new AWS.S3()
    const bucket = new AWS.S3()
    const params = {
        Bucket: S3_IMAGE_BUCKET,
        Key: fileName,
        Body: fileContent
    };
    
    // Uploading files to the bucket
    s3.upload(params, function(err, data) {
          if (err) {
              throw err;
          }
          console.log(`File uploaded successfully. ${data.Location}`);
    });
  }

  app.get('/home/s3Upload', s3Upload)
 

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

1. Не уверен, о чем ты на самом деле просишь. Есть fs.readdirSync() и fs.readFileSync() , но ни одно из них не должно использоваться на сервере (за исключением кода запуска), потому что они блокируют цикл событий и разрушают масштабируемость сервера. Есть также fs.promises.readdir и fs.promises.readFile те, и другие, которые все еще асинхронны, но они возвращают обещание, а не используют простой обратный вызов.

2. Кроме того, пожалуйста, НИКОГДА не пишите if (err) { throw err; } внутри асинхронного обработчика внутри обработчика маршрута http-сервера. Вам нужно написать реальную обработку ошибок, которая отправляет ответ на ошибку, а не выбрасывать асинхронно, что не принесет ничего полезного.

Ответ №1:

Вы можете сделать что-то вроде этого:

 import { readdir } from 'fs/promises';
//or with require

const readdir = require('fs/promises').readdir;

try {
  const files = await readdir(path);
  for (const file of files)
    console.log(file);
} catch (err) {
  console.error(err);
}

 

Проверьте здесь все API обещаний, предоставляемые FS в Node.js.