nodejs api - הרחבת האובייקט.

nodejs api - הרחבת האובייקט.

(הפורום נחטף ברגע זה, והופך להיות פורום node.js עד להודעה חדשה
)

api סטנדרטי של node, שולף רשימת רשומות מ mongo/mongoose ומחזיר כ json.
אני רוצה לשנות קצת את הרשימה המוחזרת. להוסיף שדה מחושב, לשנות ערכים, להשמיט שדה מסוים, וכן הלאה. איך עושים את זה?
הקוד שיש לי היום:
קוד:
// Gets a list of Products
export function index(req, res) {
  Product.findAsync()
    .then(respondWithResult(res))
    .catch(handleError(res));
}


function respondWithResult(res, statusCode) {
  statusCode = statusCode || 200;
  return function(entity) {
    if (entity) {
      res.status(statusCode).json(entity);
    }
  };
}
 

Royi Namir

New member
לא שונה מכל JS אחר.

ברגע שיש לך JSON תצטרך לעבור עליו ולעשות בדיוק את הפעולה שרצית
&nbsp
 
OK

אתה יכול להסביר לי את הפונקציה השניה, respondWithResult ?
מה קורה שם? מאיפה entity מקבל את הערך שלו?
 

MoAtlow

New member
respondWithResult

זו פונקציה שמחזירה פונקציה.
ואז בפונקציה שחוזרת משתמשים כCALLBACK לPROMISE.
כלומר, את הקוד הזה:
קוד:
  Product.findAsync().then(function(entity) {
    if (entity) {
      res.status(200).json(entity);
    }
  });

אפשר להפוך לגנרי כך:
קוד:
export function index(req, res) {

  var cb = respondWithResult(res, 200);

  Product.findAsync()
    .then(cb)
    .catch(handleError(res));
}


function respondWithResult(res, statusCode) {
  statusCode = statusCode || 200;
  return function(entity) {
    if (entity) {
      res.status(statusCode).json(entity);
    }
  };
}
 

MoAtlow

New member
נגיד משהו כזה

אתה יכול לעשות איזה מניפולציות שתרצה על FINAL

קוד:
export function index(req, res) {
  Product.findAsync()
    .then(function(entity) {
        var final = entity.toObject() //[URL]http://mongoosejs.com/docs/api.html#document_Document-toObject[/URL]

        final.a = 123;
        final.count = 555;

        res.json(final);
      }
    })
    .catch(handleError(res));
}
 
תודה רבה, ייבדק בערב.

מה שבטוח, אני צריך לקרוא קצת באתר של מונגוס על הדברים האלה.
&nbsp
אגב, שים לב ש entity במקרה זה הוא רשימה, כך שכנראה אתה לא יכול סתם לגשת לפרופרטיז, אלא צריך לעשות איזה לולאה, ולרוץ עליה, ועל כל פריט לשנות מה שבא לך.
 
מעולה. הנה התוצאה הסופית

קוד:
function respondWithResult(res, statusCode) {
  statusCode = statusCode || 200;
  return function(entity) {
    if (entity) {
      var final = [];
      _.forEach(entity, function(x){
         var obj = {};
         obj.firstname=x.firstname;
         obj.lastname=x.lastname;
         obj.price=100;
         final.push(obj);
      })

      res.status(statusCode).json(final);
    }
  };
}
בקיצור, כמו שאמר רועי, מערך ב JS, תעשה מה בא לך.
 

Royi Namir

New member
הייתי מוסיף

קוד:
I would also add  : 



if (entity && Object.prototype.toString.apply(a) === "[object Array]")

{
 //.....
}

Although forEach will also work on Objects. But I assume you rely on an array only.
 

MoAtlow

New member
לא צריך.

אם זה לא מערך MONGOOSE יעשה reject לPromise, והקוד הנל לא ירוץ
 
למעלה