파일에서 잘못된 URL을 찾아보자!!
준비
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 infoyargs
.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는 간단한 API
axios.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
Reference
이 문제에 관하여(파일에서 잘못된 URL을 찾아보자!!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/klee214/let-s-find-wrong-url-in-your-file-1c67텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)