Nodejs рекурсивная проверка имени файла для fswrite - PullRequest
2 голосов
/ 11 марта 2020

Я беру длинную строку URL и разбираю имя файла для сохранения с помощью fs.writefile (). Большинство ответов в стеке говорят, что нужно использовать lastIndexOf ('/'), но это не работает, когда есть несколько модификаторов после появления имени файла в URL. Я создал функцию, которая рекурсивно удаляет последний раздел после последнего '/', пока не будет найдено правильное имя файла. Что мне здесь не хватает? Почему я не определен?

exports.shortFileNameFn = (longUrlPath) => {
    if (longUrlPath) {
        //remove possible url querystring
        if (longUrlPath.lastIndexOf('?')>-1) longUrlPath=longUrlPath.substring(0,longUrlPath.lastIndexOf('?'));

        //recursively remove the section after the last '/' until a valid filename occurs
        const idx = longUrlPath.lastIndexOf('/');
        if (/^(?=[\S])[^\\ \/ : * ? " < > | ]+$/.test(longUrlPath.substring(idx + 1))) {         
            const validFileName = longUrlPath.substring(idx + 1);
            console.log(validFileName); //Returns SB_20Detail.jpg
            return validFileName;
        }
        //if name not yet valid, remove last section and call function again
        longUrlPath = longUrlPath.substring(0, idx);
        this.shortFileNameFn(longUrlPath);
    } 
};

//Calling code in app.js
const { shortFileNameFn } = require('./toStack');
const longProductImageUrl = 'https://img1.wsimg.com/isteam/ip/7ed83e96-6fb7-4d7c-bfe9-1a34fcbed15e/SB_20Detail.jpg/:/cr=t:31.25_25,l:0_25,w:100_25,h:37.5_25/rs=w:388,h:194,cg:true';
const shortProductImageUrl = shortFileNameFn(longProductImageUrl);
console.log('Short File Name:', shortProductImageUrl); //Returns undefined

1 Ответ

1 голос
/ 12 марта 2020

Вы вызываете shortFileNameFn рекурсивно, но не возвращаете результат. Вы можете решить эту проблему следующим образом:

exports.shortFileNameFn = (longUrlPath) => {
    if (longUrlPath) {
        //remove possible url querystring
        if (longUrlPath.lastIndexOf('?')>-1) longUrlPath=longUrlPath.substring(0,longUrlPath.lastIndexOf('?'));

        //recursively remove the section after the last '/' until a valid filename occurs
        const idx = longUrlPath.lastIndexOf('/');
        if (/^(?=[\S])[^\\ \/ : * ? " < > | ]+$/.test(longUrlPath.substring(idx + 1))) {         
            const validFileName = longUrlPath.substring(idx + 1);
            console.log(validFileName); //Returns SB_20Detail.jpg
            return validFileName;
        }
        //if name not yet valid, remove last section and call function again
        longUrlPath = longUrlPath.substring(0, idx);
        return this.shortFileNameFn(longUrlPath);
    } 
};

Чтобы увидеть, как происходит рекурсия, попробуйте добавить console.log в начале функции shortFileNameFn, и вы должны увидеть, что она появляется несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...