У меня есть маршрут, который я использую для фильтрации некоторых данных
import {Request, Response} from 'express';
import {MODELS} from "./db-data";
import {setTimeout} from "timers";
export function searchModel(req: Request, res: Response) {
const queryParams = req.query;
const modelId = queryParams.modelId,
filter = queryParams.filter || '',
sortOrder = queryParams.sortOrder || 'asc',
pageNumber = parseInt(queryParams.pageNumber) || 0,
pageSize = parseInt(queryParams.pageSize) || 3;
let models:any = Object.values(MODELS).sort((l1:any, l2:any) => l1.id - l2.id);
models = models.filter(model => model.title.trim().toLowerCase().search(filter.toLowerCase()) >= 0);
if (sortOrder == "desc") {
models = models.reverse();
}
const initialPos = pageNumber * pageSize;
const modelsPage = models.slice(initialPos, initialPos + pageSize);
setTimeout(() => {
res.status(200).json({payload: modelsPage});
},1000);
}
МОДЕЛИ - это такой объект
export const MODELS: any = {
0: {
id: 0,
title: "test1",
category: 'category1',
longDescription: "Lorem ipsum"
},
....
....
Затем в моем файле server.ts:
app.route('/api/models').get(searchModel);
На стороне клиента у меня есть компонент, и я использую RxJ для фильтрации результатов следующим образом:
export class RepositoryComponent implements OnInit, AfterViewInit {
modelList$: Observable<Model[]>;
@ViewChild('searchInput', { static: true }) input: ElementRef;
constructor() { }
ngOnInit() {
setRxJsLoggingLevel(RxJsLoggingLevel.TRACE);
}
ngAfterViewInit() {
this.modelList$ = fromEvent<any>(this.input.nativeElement, 'keyup')
.pipe(
map(event => event.target.value),
startWith(''),
debug( RxJsLoggingLevel.TRACE, "search "),
debounceTime(400),
distinctUntilChanged(),
switchMap(search => this.loadModels(search)),
debug( RxJsLoggingLevel.DEBUG, "lessons value ")
);
}
loadModels(search = ''): Observable<Model[]> {
return createHttpObservable(`/api/models?pageSize=100&filter=${search}`)
.pipe(
map(res => res["payload"])
);
}
}
Наблюдатель работает правильно и возвращает все модели правильно. Но если я попытаюсь отфильтровать запрос, набрав «test1»:
http://localhost:4200/api/models?pageSize=100&filter=test1
Это не работает и всегда возвращает все модели. Я не могу понять это