MongoDB mongoose — обратные вызовы

#javascript #mongodb #express #mongoose

#javascript #mongodb #экспресс #мангуст

Вопрос:

Мне трудно понять, почему мой обратный вызов оправдывает, но не возвращает значение. data.ItemId регистрируется в консоли, но похоже, что avatar.ItemId не возвращается. Вы не можете вернуть значения вновь созданного документа? Уверен, что я просто делаю это неправильно. Я прочитал это, но я все еще не уверен, куда возвращается обратный вызов или почему данные не возвращаются из вызова saveAvatarImage.

 const Image = require("../model/Image");

const saveAvatarImage = async (uploadImage, id) => {
  const fs = require("fs");
  //Set image data
  let options = { upsert: true, new: true, omitUndefined: true };
  let update = {
    timestamp: Date.now(),
    img: {
      data: fs.readFileSync(uploadImage.filepath),
      contentType: uploadImage.mimetype,
    },
  };
  let filter = { itemId: id };
  let callback = function (err, data) {
    if (err) console.log(err);
    console.log(data.itemId);
    return data.itemId;
  };
  //Create image in db
  let avatar = await Image.findOneAndUpdate(filter, update, options, callback);
  return avatar.itemId;
};

module.exports = { saveAvatarImage };
  

это работает

 busboy.on("finish", async function () {
    //check for upload
    if (isEmptyObj(uploadImage))
      return res.status(400).json({ error: "Something went wrong." });
    //if image is for profile
    if (formValues.type === "avatar") {
      //////save image to database
      // saveAvatarImage(uploadImage, id);
      //Set image data
      let options = { upsert: true, new: true, omitUndefined: true };
      let update = {
        timestamp: Date.now(),
        img: {
          data: fs.readFileSync(uploadImage.filepath),
          contentType: uploadImage.mimetype,
        },
      };
      let filter = { itemId: req.user._id };
      //Create image in db
      const avatar = await Image.findOneAndUpdate(
        filter,
        update,
        options,
        function (err, data) {
          if (err) console.log(err);
          console.log(data);
        }
      );
      return res.json(avatar);
    }
  });
  

я хочу это сделать. (решаемая)

 busboy.on("finish", async function () {
    //check for upload
    if (isEmptyObj(uploadImage))
      return res.status(400).json({ error: "Something went wrong." });
    //if image is for profile
    if (formValues.type === "avatar") {
      //////save image to database
      let avatar = await saveAvatarImage(uploadImage, req.user._id);
      
      return res.json(avatar);
    }
  });
  

Ответ №1:

Внутри вашего обратного вызова попробуйте:

 let callback = function (err, data) {
    if (!err amp;amp; data) return data;
    
    else console.log(err ? err : "Data not defined");
  }

  

Я бы предположил, что вы должны возвращать весь data объект, а затем делать avatar.itemId после await , как вы сейчас делаете.

Комментарии:

1. я смог заставить его работать после того, как добавил await к вызову функции. не уверен, что вы это имели в виду, но спасибо!