probe-review-pagination.mjs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. const asin = process.env.ASIN || 'B0G8D23R1Q';
  2. const baseUrl = process.env.API_URL || 'http://127.0.0.1:3000/api/sorftime/forward';
  3. function unwrap(result) {
  4. let data = result?.data ?? result?.Data ?? result;
  5. while (data && typeof data === 'object' && !Array.isArray(data)
  6. && (data.data !== undefined || data.Data !== undefined)) {
  7. data = data.data ?? data.Data;
  8. }
  9. return data;
  10. }
  11. async function query(body) {
  12. const response = await fetch(baseUrl, {
  13. method: 'POST',
  14. headers: { 'Content-Type': 'application/json' },
  15. body: JSON.stringify({
  16. path: '/api/ProductReviewsQuery',
  17. method: 'POST',
  18. query: { domain: 1 },
  19. body,
  20. }),
  21. signal: AbortSignal.timeout(60000),
  22. });
  23. const result = await response.json();
  24. const data = unwrap(result);
  25. const reviews = data?.Reviews || data?.Items || data?.List || (Array.isArray(data) ? data : []);
  26. return {
  27. status: response.status,
  28. rows: reviews.map(review => ({
  29. id: review.ReviewId || review.Id || review.ID || review.id,
  30. date: review.ReviewsDate || review.ReviewDate || review.Date,
  31. star: review.Star || review.Rating,
  32. verified: review.OnlyPurchase || review.VerifiedPurchase,
  33. contentLength: String(review.Content || review.ReviewContent || review.Body || '').length,
  34. })),
  35. dataKeys: data && typeof data === 'object' ? Object.keys(data) : [],
  36. message: result?.message || result?.Message || '',
  37. };
  38. }
  39. const tests = [
  40. { label: 'year-page-1', body: { ASIN: asin, PageIndex: 1, OnlyPurchase: 0, Star: '1,2,3,4,5', QueryStartDt: '2025-09-18', QueryEndDt: '2026-09-18' } },
  41. { label: 'year-page-size-100', body: { ASIN: asin, PageIndex: 1, PageSize: 100, OnlyPurchase: 0, Star: '1,2,3,4,5', QueryStartDt: '2025-09-18', QueryEndDt: '2026-09-18' } },
  42. { label: 'year-page-2-alt', body: { ASIN: asin, Page: 2, OnlyPurchase: 0, Star: '1,2,3,4,5', QueryStartDt: '2025-09-18', QueryEndDt: '2026-09-18' } },
  43. { label: 'year-page-0', body: { ASIN: asin, PageIndex: 0, OnlyPurchase: 0, Star: '1,2,3,4,5', QueryStartDt: '2025-09-18', QueryEndDt: '2026-09-18' } },
  44. { label: 'recent-window', body: { ASIN: asin, PageIndex: 1, OnlyPurchase: 0, Star: '1,2,3,4,5', QueryStartDt: '2026-06-01', QueryEndDt: '2026-09-18' } },
  45. { label: 'older-window', body: { ASIN: asin, PageIndex: 1, OnlyPurchase: 0, Star: '1,2,3,4,5', QueryStartDt: '2025-09-18', QueryEndDt: '2026-05-31' } },
  46. ];
  47. for (const test of tests) {
  48. try {
  49. console.log(JSON.stringify({ label: test.label, body: test.body, result: await query(test.body) }));
  50. } catch (error) {
  51. console.log(JSON.stringify({ label: test.label, error: error.message }));
  52. }
  53. await new Promise(resolve => setTimeout(resolve, 500));
  54. }