yeah filesystem access is must faster using sync version of the functions
the only reason not to use it is if you have a remote (network) filesystem where read/write operations are slow
אשמח לסיוע תקוע על הבעיה כבר יומים
תרגיל 1 חלק ראשון
הקוד
const express = require('express');
const app = express();
const fs = require('fs');
app.get('/', function (req, res) {
let ret = '';
fs.readdir(__dirname, (err, files) => {
if (err) {
console.log(err);
} else {
for (ent of files) {
ret = ret + getTypeOfEntry(ent);
console.log(ret);
}
}
});
if (ret !== '') {
console.log(ret);
res.send(ret);
}
});
function getTypeOfEntry(ent) {
ret = '';
fs.stat(ent, (err, stat) => {
do{
if (err) {
ret = `Nothing found at: ${ent}`;
console.log(`Nothing found at: ${ent}`);
break;
}
if (stat.isFile()) {
console.log(`F ${ent}`);
ret = `F ${ent}`;
break;
}
if (stat.isDirectory()) {
console.log(`D ${ent}`);
ret = `F ${ent}`;
break;
}
}while(false);
return ret;
});
}
app.listen(3000);
אני מקבל את התוצאה הבאה במסך ה CMD
ושום דבר בדפדפן
אשמח לכיוון
הי,
כשלא מקבלים תוצאה בדפדפן הסיבה היא כמעט תמיד שלא הפעלת res.send. אני רואה שגם אצלך בקוד הקריאה ל res.send היא בתוך if אז רק עד לפה עושה רושם שלא נכנסים ל if הזה.
ליד כל console.log כדאי להוסיף מזהה שיגיד לך (בהדפסות על המסך) מאיזה שורת console.log הגעת. דבר נוסף שתנסה להסתכל עליו הוא סדר פעולות - מה קורה ומתי. צריך לשים לב שהפונקציה readdir מקבלת Callback Function, ולכן מבחינת סדר פעולות הקוד שכתוב אחרי ה Callback Function אבל לפני סוף הפונצקיה ש app.get קיבלה יתבצע לפני זה שכתוב בתוך ה Callback Function (ואני מצטער שהמשפט הזה יצא קצת מסורבל, לא מצאתי דרך קלה לכתוב אותו. מקווה שאחרי שתוסיף את ההדפסות ב console.log-ים זה יהיה יותר ברור)
ממה שאני רואה ה res.send שלך קורה מוקדם מדי, לפני ש ret מקבל את הערך המלא שלו ולכן לא נכנסים שם ל if.
נ.ב. אני רואה שהוספת קריאות ל console.log. גם אני אוהב לדבג ככה כדאי להכיר אבל שכלי פיתוח כמו VS Code ו Webstorm כוללים debugger יותר מתוחכם.
ינון תודה על תשובתך
אתחיל מהסוף אני משתמש ב [Deprecated] Node Debug כדי לדבג.
הוא נוח אבל אני כמובן פתוח להמלצות אחרות.
הכנסתי את v
res.send לתוך if כדי להיות בטוח שהוא לא נקרא ללא ערך כאחד מניסיונות הדיבוג.
ברור לי שהבעיה המרכזית בקוד שלי היא לגרום ל
res.send להיקרא לאחר שה
Callback Function
מבוצעת.
פשוט תכניס אותו לתוך ה Callback Function
דבר נוסף - אחרי שזה יעבוד לך תראה בשיעור כאן:
https://www.tocode.co.il/bundles/nodejs/lessons/08-read-write-files?tab=video
באזור דקה 6:33 אני מסביר על Promises וממשק async/await. אני ממליץ אחרי שהכל עובד לשכתב את הכל כדי להשתמש בממשק async/await כדי לראות את ההבדלים
ובסוף אחרי ש async/await עובד שוב לשכתב לממשק הסינכרוני כדי לראות איך הוא עובד
תודה על ההכוונה הקוד הבא עובד אבל אני לא מרוצה ממנו
const express = require('express');
const app = express();
const fs = require('fs');
app.get('/', (req, res) => {
let ret = '';
fs.readdir(__dirname, (err, files) => {
if (err) {
console.log(err);
}
for (ent of files) {
// ret = ret + "<br>" + getTypeOfEntry(ent);
let fd = '';
statsObj = fs.statSync(ent);
if(statsObj.isFile()){
fd = "F";
}else{
if(statsObj.isDirectory()){
fd="D";
}else{
fd="UN";
}
}
ret = `${ret}<br>${ent} ${fd}`;
}
res.send(ret);
});
});
app.listen(3000);
הבעיה מבחינתי שהשתמשתי statSync במקום ב stat
הסיבה לשימוש היא חוסר הבנה כיצד להשתמש ב Callback Function בתוך Callback Function בצורה נכונה כך שהקריאה ל res.send תתבצע לאחר סיום כל פנקציות ה Callback Function
מקווה שהניסוח שלי ברור.
כמובן אקח את ההמלצה לשכתב לממשק Promises וממשק async/await ולממשק סנכורני מלא. הקוד הנוכחי שלי משלב ממשק אסינכרוני וממשק סינכרוני.
ינון תודה רבה על תשובתך.
הניסוח ברור לגמרי ואתה לא הראשון שלא אוהב את המבנה הזה. הנה מאמר חשוב על הנושא שנקרא Callback Hell:
http://callbackhell.com
באופן כללי זאת הסיבה שהסנטימנט היום הוא לכיוון שימוש ב Promises ו async/await הרבה יותר מאשר Callback Functions.
היי,
לגבי שאלה מספר 2 , סעיף 2:
אשמח בבקשה לדעת האם אני בכיוון.
אני מקבלת תיקיות וקבצים בנפרד:
תודה!
הי נראה טוב במודול Path של Node.JS יש פונקציות שיכולות לעזור בפיענוח שמות של קבצים ותיקיות, נסי להשתמש בדברים משם במקום להפעיל לבד את ה split:
https://nodejs.org/api/path.html