파일에서 잘못된 URL을 찾아보자!!

6755 단어

준비



html 파일이나 다른 파일에서 URL을 사용하는 경우가 많습니다.
대부분의 경우 서버 측 코드에서 GET, POST와 같은 http 요청을 실제로 보내지 않는 한 URL이 잘못된 것인지 알 수 없습니다. 그것들을 처리하면 잠재적으로 프로그램 속도가 느려지고 코드가 더 복잡해집니다. 우리가 사용할 URL이 모두 괜찮은지 먼저 간단히 확인하는 이유는 무엇입니까?

코딩 시작



URL 확인을 위한 CLI 프로그램을 만드는 가장 좋은 언어는 Node.js라고 생각합니다. 명령줄 인수, 출력 색상 지정 및 HTTP 요청에 유용한 수백 가지 패키지가 있습니다. 또한 현재 Mean 스택이 전체 웹 프로그램 시장을 지배하고 있는데 Node.js를 사용하지 않는 이유는 무엇입니까?

가장 먼저 요청을 위한 'axios', 'yargs' 및 'chalk', CLI 및 컬러링 출력을 각각 다운로드합니다. 그들은 삶을 더 쉽게 만듭니다!! npm i axios yargs chalk

사용자 지정 인수 만들기



'yargs' 덕분에 CLI 프로그램을 정말 쉽게 만들 수 있습니다..command()는 명령어를 만들기 위한 것이고, .example() .usage()는 명령어의 사용법과 예제(사용방법)를 보여줍니다. .alias()는 옵션을 만들고 해당 옵션에 대한 별칭을 만듭니다. More info

yargs
  .usage("Usage: url-tester <command> [options] <optionalFilename>")
  .command("start", "Test to find any broken URL")
  .example(
    "url-tester start -f foo1.html, foo2.txt (You can multiple files, delimiter is ',') ",
    " Test if there is any broken URL in the files"
  )
  .example(
    "url-tester start -f -a",
    " Test broken URL in the only 'html' files in the current dir"
  )
  .alias("f", "file")
  .alias("a", "all")
  .demandOption(["f"])
  .describe("f", "Load all specified files (delimiter is ',')")
  .describe("a", "Load all HTML files in the current dir")
  .version()
  .alias("v", "version")
  .help()
  .alias("h", "help")
  .demandCommand().argv;

위의 코드는 다음과 같이 만들 것입니다.

Usage: url-tester <command> [options] <optionalFilename>

Commands:
  index.js start  Test to find any broken URL

Options:
  -f, --file     Load all specified files (delimiter is ',')          [required]
  -a, --all      Load all HTML files in the current dir
  -v, --version  Show version number                                   [boolean]
  -h, --help     Show help                                             [boolean]

Examples:
  url-tester start -f foo1.html, foo2.txt   Test if there is any broken URL in  
  (You can multiple files, delimiter is     the files
  ',')
  url-tester start -f -a                    Test broken URL in the only 'html'  
                                            files in the current dir

파일에서 URL을 찾으십시오!



따라서 파일을 지정하거나 현재 디렉토리의 모든 파일을 재귀적으로 사용할 수 있습니다. 단순히 옵션에 의해 선택됩니다.[command] -f -a 현재 폴더의 모든 파일 또는 [command] -f filename[can be multiple files] 특정 파일만.

// decide the option if it is -f or -a
if (yargs.argv.a || typeof yargs.argv.f !== "string") {
  const tmpFiles = fs.readdirSync(__dirname, { encoding: "utf-8" });
[command] -f -a를 선택하면 현재 경로의 모든 html 파일을 찾습니다. 그리고 각 파일의 모든 URL을 테스트합니다.

  // if -a, store all files into the files variable
  files = tmpFiles.filter((file) => {
    return file.toLowerCase().endsWith(".html");
  });
} else if (typeof yargs.argv.f === "string") {
  files = [yargs.argv.f];

파일을 지정하는 경우.

  // if -f filename.txt, take all files and put into the files variables.
  if (yargs.argv._.length > 1) {
    for (let i = 1; i < yargs.argv._.length; i++) {
      files.push(yargs.argv._[i]);
    }
  }
}

그런 다음 파일의 모든 URL을 찾습니다.

  const regex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g;
  const findURL = fileData.match(regex);  

이제 파일에서 모든 URL을 찾았습니다. 이제 그들을 테스트할 시간입니다!

헤더 요청 보내기



응답 데이터가 아닌 헤더만 확인하면 됩니다. 헤더 요청만 보내기 위해 axios는 간단한 APIaxios.head(url,[config])를 제공합니다.

URL이 *302 또는 *307 및 *308인 경우 axios는 자동으로 리디렉션됩니다. 그래서 내가 액세스했을 때 response.status 그들은 모두 * 200입니다. (틀렸다면 github을 통해 알려주세요!) 하지만 그래도 그 중 하나라면 상태를 확인하는 코드를 구현했습니다.

if (response.status === 301) {
        // implementation
      } else if (response.status === 307) {
        .
        .
        .

상태가 OK(*200)이면 모든 것이 정상입니다. 상태가 불량(*404)이거나 기타 오류가 발생한 경우 사용자는 이를 인식해야 합니다.

console.log(
          chalk.black.bgGreen.bold(
            "In " + file + " file, the URL: " + url + " is success: "
          )
        );
        console.log(chalk.green.underline.bold("STATUS: " + response.status));
      }
    } catch (error) {
        // If 404 error :
      if (error.response) {
        console.log(
          chalk.white.bgRed.bold(
            "In " + file + " file, the URL: " + url + " is a bad url: "
          )
        );
        return console.log(
          chalk.red.underline.bold("STATUS: " + error.response.status)
        );
      }

시간 초과 및 존재하지 않는 URL과 같은 기타 오류가 있는 경우.

// non-exist URL
      if (error.code == "ENOTFOUND") {
        console.log(
          chalk.white.bgGrey.bold(
            "In " + file + " file, the URL: " + url + " is unknown url: "
          )
        );
        chalk.white(console.log(error.code));

        // timeout error
      } else if (error.code == "ETIMEDOUT") {
        console.log(
          chalk.white.bgGrey.bold(
            "In " + file + " file, the URL: " + url + " is TIMEOUT: "
          )
        );
        chalk.white.underline(console.log(error.code));
      } else {
          // server error or other error : error.code will indicate which error it has
        console.log(
          chalk.white.bgGrey.bold(
            "In " + file + " file, the URL: " + url + " has following issue: "
          )
        );
        chalk.white.underline(console.log(error.code));
      }

개선하기 위해



이 간단한 CLI 프로그램의 기본 기능이 완료되었습니다. 그러나 성능과 기능을 개선할 여지가 너무 많습니다. 아직 작업 중이며, 점차적으로 하나씩 개선될 수 있습니다. 이 오픈 소스 개발 프로젝트에 더 관심이 있으시면 다음을 방문하십시오.
github repo

좋은 웹페이지 즐겨찾기