NODEJS איחזור נתונים מתוך node-fetch
-
אני צריך לבצע שאילתה מול שרת, ואני צריך לקבל ולטפל בתשובה הן מתוך מה שבכותרות והן מתוך מה שבתוכן הדף.
אני לא מצליח להעביר ל then הבא רק נתון אחד.
איך אני מעביר שני נתונים
משהו בסגנון הזה:fetch('https://httpbin.org/post', { method: 'POST', body: 'a=1' }) .then(res => res.json(), res.headers.get('content-type')) .then(json, headers => console.log(json) console.log(headers) );
תודה
-
אנסה את מזלי (למרות שהנסיון שלי בנוד ו-JS שואף לאפס...)
fetch('https://httpbin.org/post', { method: 'POST', body: 'a=1' }) .then(res => { res.json().then(json => console.log(json)); console.log(res.headers.get('content-type')); });
שים לב שהקריאה ל
res.headers.get
הוא סינכרוני (וזה אחד מהטעיות בקוד שלך, זה לא מחזירpromise
אלאstring
ולכן א"א להעביר אותו לפונקצייתthen
), לכן התשובה לזה מגיע לפני התשובה לres.json
.עכשיו אני מעביר את הבמה למבינים
-
fetch('https://httpbin.org/post', { method: 'POST', body: 'a=1' }) .then(res => { return res.json().then(function(json){ return { headers: res.headers, bodyData: json }; }); }) .then(console.log);
(השורה האחרונה זה לצרכי טסט מתוך הקונסול בדפדפן).
-
בעיקרון הקוד הראשון שחוקרי עשה הוא מצויין, רק שאין כזה דבר לעשות return עם שתי ארגומנטים מופרדים בפסיק סתם.
אפשר להחזיר מערך, וזה יעבוד מצויין:fetch('https://httpbin.org/post', { method: 'POST', body: 'a=1' }) .then(res => [res.json(), res.headers.get('content-type')]) .then(arr => { console.log(arr[0]); console.log(arr[1]); });
אבל זה לא נוח להחזיר מערך כי צריך לדעת מי נמצא איפה אז צריך להחזיר אובייקט עם שמות ואז זה מחייב לפתוח את פונקציית החץ למרובת שורות שזה מה שעשיתי.
-
@dovid אמר בNODEJS איחזור נתונים מתוך node-fetch:
return { headers: res.headers, bodyData: json };
לכאורה צ"ל
res.headers.get()
כי בלא זה, זה לא מאוכלס.@dovid ללמוד אני צריך, האם יש משהו לא נכון במה שכתבתי (נסיתי את הקוד לפני שהעליתי), או שסתם כתבת עוד דרכים?
-
@yossiz בקשר לget אתה צודק. זה אומר שא"א לגשת להכל בצורה קלה, במידה וזה נדרש אז אולי יש להשתמש בדרך אחרת מfetch (יש Headers.getAll() אבל זה מסומן כobsolate).
הקוד שלך מצויין אבל א. רציתי להעמיד את הקוד הראשוני על מתכונתו ב. הקוד הראשוני שמיש יותר מהקוד שלך כי אצל פיסות המידע (גוף התשובה והכותרות) מאוחזרות בשתי נקודות זמן שזה פחות שמיש בתכנות נורמלי בJS. -
@dovid אמר בNODEJS איחזור נתונים מתוך node-fetch:
console.log(arr[0]);
עדיין לא הסתדר.
כאשר ניסיתי לעשות כך ולבצע עיבוד נתונים של התוכן זה נכשל כי הוא מקבל אותו כאיזה שהוא סוג אובייקט של פרומיס, ולא כמערך ג'יסון[ Promise { <pending> }, 'application/json' ] Promise { <pending> } application/json TypeError: Cannot read property 'forEach' of undefined
הקוד הוא
.then(res => [res.json(), res.headers.get('content-type')]) .then(arr => { console.log(arr); teams_stats = arr[0]; console.log(arr[0]); console.log(arr[1]); arr[0].data.forEach(function (team) { // } })
-
צודק טעיתי, צריך לעשות את זה אחרת, מסובך טיפה:
fetch('https://httpbin.org/post', { method: 'POST', body: 'a=1' }) .then(res => Promise.all([res.json(), res.headers.get('content-type')])) .then(arr => { console.log(arr[0]); console.log(arr[1]); });
אבל לדעתי יותר אלגנטי להשתמש עם אובייקט.
-
@חוקר אמר בNODEJS איחזור נתונים מתוך node-fetch:
@dovid אמר בNODEJS איחזור נתונים מתוך node-fetch:
(res => Promise.all([res.json(), res.headers.get('content-type')]))
תודה
כך זה עובד.
השאלה היא, אם לפני ואחרי הבקשה הזו אני משתמש בבקשות fetch נוספות, זה משפיע אליהם משהו?לא משפיע.
-
@dovid אמר בNODEJS איחזור נתונים מתוך node-fetch:
צודק טעיתי, צריך לעשות את זה אחרת, מסובך טיפה:
fetch('https://httpbin.org/post', { method: 'POST', body: 'a=1' }) .then(res => Promise.all([res.json(), res.headers.get('content-type')])) .then(arr => { console.log(arr[0]); console.log(arr[1]); });
אבל לדעתי יותר אלגנטי להשתמש עם אובייקט.
כך זה עובד, רק למה לא הולך לעשות את זה סתם כמערך, למשל:
fetch('https://httpbin.org/post', { method: 'POST', body: 'a=1' }) .then(res => [res.json(), res.headers.get('content-type')]) .then(arr => { console.log(arr[0]); console.log(arr[1]); });