nodejs - получить имя файла из URL

У меня есть такая ссылка в моем скрипте Node.js:

148414929_307508464041827_8013797938118488137_n.mp4.m4a?_nc_ht=scontent-mxp1-1.cdninstagram.com&_nc_ohc=_--i1eVUUXoAX9lJQ-u&ccb=7-4&oe=60835C8D&oh=61973532a48cb4fb62ac6711e7eba82f&_nc_sid=fa

Я пытаюсь использовать этот код, чтобы получить имя, чтобы сохранить его как аудиофайл, но я не могу получить расширение файла .mp4.m4a из URL-адреса:

const filename = path.basename(data.message.voice_media.media.audio.audio_src);

Как я могу заставить расширение файла правильно удалить последнюю часть URL-адреса? Я умею сохранять файлы, и если я уберу часть имени перед нужным расширением, он будет воспроизводиться без проблем.

ОБНОВЛЕНИЕ

Как было предложено в комментариях, я прочитал связанный вопрос, но в моем случае мне не нужно получать только расширение файла, а первую часть URL-адреса, которая уже содержит необходимое аудиорасширение, а именно: 148414929_307508464041827_8013797938118488137_n.mp4.m4a.


person newbiedev    schedule 23.03.2021    source источник
comment
Отвечает ли это на ваш вопрос? Node.js получить расширение файла   -  person sergdenisov    schedule 23.03.2021
comment
нет, это не сработает. Использование path.extname() вернет мне неправильную часть URL-адреса, а не имя файла, которое 148414929_307508464041827_8013797938118488137_n.mp4.m4a   -  person newbiedev    schedule 23.03.2021
comment
У вас есть абсолютный URL? Что-то вроде https://test.com/148414929_307508464041827_8013797938118488137_n.mp4.m4a?_nc_ht=scontent-mxp1-1.cdninstagram.com&_nc_ohc=_--i1eVUUXoAX9lJQ-u&ccb=7-4&oe=60835C8D&oh=61973532a48cb4fb62ac6711e7eba82f&_nc_sid=fa?   -  person sergdenisov    schedule 23.03.2021
comment
да, первоначальный URL-адрес перед его передачей в basename является абсолютным.   -  person newbiedev    schedule 23.03.2021
comment
После вашего редактирования кажется, что вам нужно не расширение, а путь. Попробуйте это: new URL('https://test.com/148414929_307508464041827_8013797938118488137_n.mp4.m4a?_nc_ht=scontent-mxp1-1.cdninstagram.com&_nc_ohc=_--i1eVUUXoAX9lJQ-u&ccb=7-4&oe=60835C8D&oh=61973532a48cb4fb62ac6711e7eba82f&_nc_sid=fa').pathname.replace('/', '')   -  person sergdenisov    schedule 23.03.2021
comment
да, отлично работает, спасибо! Если вы добавите ответ, я его приму   -  person newbiedev    schedule 23.03.2021
comment
Добавил некоторые улучшения и выложил.   -  person sergdenisov    schedule 23.03.2021


Ответы (1)


Я рекомендую использовать URL() constructor (работает как в браузерах, так и в Node. js), потому что вы можете быть уверены, что ваш URL действителен:

const url = 'https://test.com/path/148414929_307508464041827_8013797938118488137_n.mp4.m4a?_nc_ht=scontent-mxp1-1.cdninstagram.com&_nc_ohc=_--i1eVUUXoAX9lJQ-u&ccb=7-4&oe=60835C8D&oh=61973532a48cb4fb62ac6711e7eba82f&_nc_sid=fa';

let filename = '';
try {
  filename = new URL(url).pathname.split('/').pop();
} catch (e) {
  console.error(e);
}
console.log(`filename: ${filename}`);

person sergdenisov    schedule 23.03.2021
comment
почему вы использовали .split() вместо замены, как комментарий? - person newbiedev; 23.03.2021
comment
@newbiedev, потому что он не работает в случае, когда ваш файл лежит не в корневом каталоге. Я специально указал на это в своем примере. Я имею в виду, когда у тебя не /file.txt, а /path/file.txt. - person sergdenisov; 23.03.2021
comment
хорошо, входной URL-адрес что-то вроде https://scontent-mxp1-1.cdninstagram.com/v/t69.10824-16/164227760_3862884277124080_4358374852660862001_n.mp4.m4a?_nc_ht=scontent-mxp1-1.cdninstagram.com&_nc_ohc=vsuob2J4YmYAX_eQu61&ccb=7-4&oe=6084423C&oh=1b146860997bfc0480342ffe797b7b&_nc_sid=195af5, поэтому я полагаю, что ваше решение будет в порядке - person newbiedev; 24.03.2021