Как мне получить файлы для массива путей в Node JS? - PullRequest
0 голосов
/ 11 июля 2020

У меня есть некоторые функции, которые извлекают имена файлов изображений профиля для каждого пользователя в моем приложении. Допустим, мне нужны изображения профиля для 10 пользователей. Мое приложение будет делать 10 запросов к серверу.

Однако я понял, что это действительно неэффективно, поэтому решил написать функцию, которая принимает массив путей и возвращает имя файла для изображения в каждом из них. пути.

Я сохраняю изображение профиля каждого пользователя в каталоге, который соответствует их идентификатору пользователя, например /some/path/userid/profile-image.jpg

Вот как выглядит упрощенная функция:

 getProfilePhotoFileNamesForUsers: async (server, request) => {
    
    var imageFilesArray = [];

    try {

        for await (const userId of userIdsArray) {

            const path = `${process.cwd()}/uploads/${userId}`;
    
            Fse.exists(path, async (exists) => {
                    
    
                        if (exists) {
                                                   
                            const fileName = await Fse.readdir(`${process.cwd()}/uploads/${userId}`);
    
                            let fileNameObject = {
                                user_id: userId,
                                file_name: fileName[0]
                            };
        
                            imageFilesArray.push(fileNameObject);
    
                        } else {

                            let fileNameObject = {
                                userId: userId,
                                fileName: undefined
                            };
    
                            imageFilesArray.push(fileNameObject);
                        }
    
                });
    
            };
                     
               return imageFilesArray
        }

    catch(error) {

      console.log(error)

    }
}

Изначально я использовал forEach, но обнаружил, что sync / await не работает с таким типом для l oop. ImageFilesArray всегда возвращался до завершения forEach l oop.

В итоге я использовал for-of l oop, который вы видите выше. Однако результат все тот же. Массив обновляется, но его переменная всегда возвращается до начала for-of l oop.

Я также пробовал использовать обещания, но результат тот же. Вот почему мне интересно, поступаю ли я неправильно.

Есть ли способ, которым я могу просто предоставить массив путей (построенных путем предоставления массива идентификаторов пользователей) и получить обратно массив совпадающих каталогов, которыми я могу управлять? Это означало бы, что мне не нужно использовать for-l oop.

1 Ответ

1 голос
/ 11 июля 2020

Вам нужно будет повторно адаптировать его к вашему коду, так как я не могу протестировать его без каталога userIds, но вы можете использовать функцию map() вместо своей для l oop. Вот асинхронная c версия, которая должна работать для вашего примера:

let userIdsArray = [1, 2, 3, 4]

const getProfilePhotoFileNamesForUsers = async () => {
  // Use the map() function instead of a for loop
  return Promise.all(userIdsArray.map(async (userId) => {
    // Get teh corresponding path
    const path = `${process.cwd()}/uploads/${userId}`;
    // Await to see if the path exists
    let exists = await Fse.exists(path)
    return {
      user_id: userId,
      file_name: exists ?
        await Fse.readdir(`${process.cwd()}/uploads/${userId}`)[0] : undefined
    }
  }))
}

getProfilePhotoFileNamesForUsers().then(data => console.log(data))

Надеюсь, это имеет смысл! ?

...