Я создаю простой веб-сканер в node.js
, используя TypeScript и inversify.js
для управления своими зависимостями. Я работаю над этим проектом, главным образом, чтобы получить лучшую оценку asp из OOP (о которой у меня не было особых знаний, я работаю в основном с внешним интерфейсом) и внедрение зависимостей. Мой вопрос об использовании сторонних зависимостей в моих классах. Как мне разделить следующий класс и ввести зависимость Cheerio
, чтобы этот код следовал принципам SOLID? Этот класс предоставляет открытый метод c analyseWebsite
, который:
- принимает URL-адрес веб-сайта
- делает запрос на этот URL-адрес для получения необработанного разметка веб-сайта
- создает обертку
Cheerio
из разметки - , а затем использует закрытые методы, которые принимают обертку в качестве аргумента, возвращает заголовок, описание и все URL-адреса веб-сайта, которые он находит в тегах
<a>
в выбранном HTML.
@injectable()
export class CheerioTraverser implements MarkupTraverser {
constructor(
@inject(TYPES.MarkupFetcher) private fetcher: MarkupFetcher,
) { }
async analyseWebsite(url: string): Promise<AnalysedWebsite> {
const body = await this.fetcher.getMarkup(url);
const wrapper: CheerioStatic = cheerio.load(body);
return {
url: url,
title: this.getSiteTitle(wrapper),
anchors: this.getAllAnchors(wrapper),
description: this.getSiteDescription(wrapper),
};
}
private getAllAnchors(wrapper: CheerioStatic): string[] {
const allAnchorTags = wrapper('a');
const allUrls = allAnchorTags.toArray().map((a) => (
a.attribs.href
));
try {
return allUrls.filter(url => url.includes('http'));
} catch (e) {
return [];
}
}
private getSiteTitle(wrapper: CheerioStatic): string {
return wrapper("title").text();
}
private getSiteDescription(wrapper: CheerioStatic): string {
return wrapper('meta[name="description"]').attr('content');
}
}
Реализует следующий интерфейс:
export interface MarkupTraverser {
analyseWebsite(url: string): Promise<AnalysedWebsite>;
}