Асинхронный / ожидающий объект, которому не назначено

#javascript #node.js #mongoose #properties

#javascript #node.js #мангуст #свойства

Вопрос:

У меня есть функция async / await, которая не присваивается объекту, и я не знаю почему. Я утешаю результаты, и они кажутся кошерными, но когда он попадает в фактическое присвоение объекту, он не присваивается. Я объясню ниже:

Итак, вот код:

Это всего лишь вспомогательная функция для asyncForEach:

   async function asyncForEach(array, callback) {
    for (let index = 0; index < array.length; index  ) {
      await callback(array[index], index, array);
    }
  }
  

Тогда у меня есть следующее:

 const asyncFunc = async () => {
  await asyncForEach(tempPosts, async (tempPost) => {
    if (tempPost.fileName!=''){

      console.log('tempPosts[tempPosts.indexOf(tempPost)]: ',
      tempPosts[tempPosts.indexOf(tempPost)])

      console.log("await fsPromise.readFile(__dirname '/../picFolder/sharp/' tempPost.fileName)", 
      await fsPromise.readFile(__dirname '/../picFolder/sharp                
      /' tempPost.fileName))

      tempPosts[tempPosts.indexOf(tempPost)]['data'] = 
      await fsPromise.readFile(__dirname '/../picFolder/sharp/' tempPost.fileName)

      console.log('after assignment and value of tempPosts in asyncForEach: ', tempPosts)
    }
  })
}
  

Итак, вот результаты трех журналов javascript:

 console.log('tempPosts[tempPosts.indexOf(tempPost)]: ',
tempPosts[tempPosts.indexOf(tempPost)])
  

Приводит к

 tempPosts[tempPosts.indexOf(tempPost)]:  { flags: 0,
  fileName: '1552601360288amp;amp;travelmodal.png',
  comments: [],
  _id: 5c8ad110ef45f6e51a323a18,
  body: 'asdasdfasdf',
  created: 2019-03-14T22:09:20.427Z,
  __v: 0 }
  

Который кажется правильным.

И

 console.log("await fsPromise.readFile(__dirname '/../picFolder/sharp/' tempPost.fileName)", 
await fsPromise.readFile(__dirname '/../picFolder/sharp                
  /' tempPost.fileName))
  

Выдает…

 await fsPromise.readFile(__dirname '/../picFolder/sharp/' tempPost.fileName)
<Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 c8 00 00 00 62 08 06 00 00 00 15 df 9c 16 00 00 00 09 70 48 59 73 00 00 16 25 00 00 16 25 01 ... >
  

Это действительно длинная строка буфера данных, которую я хочу. Прохладный.

ОДНАКО

 after assignment and value of tempPosts in asyncForEach:  [ { flags: 0,
    fileName: '1552601360288amp;amp;travelmodal.png',
    comments: [],
    _id: 5c8ad110ef45f6e51a323a18,
    body: 'asdasdfasdf',
    created: 2019-03-14T22:09:20.427Z,
    __v: 0 },
  { flags: 0,
    fileName: '1552601320137amp;amp;Screen Shot 2019-03-09 at 10.03.09 AM.png',
    comments: [],
    _id: 5c8ad0e8ef45f6e51a323a17,
    body: 'adf',
    created: 2019-03-14T22:08:40.336Z,
    __v: 0 } ]
  

Что? Показано, что мой вызов — это Object['newKey'] = await fsPromise.readFile(yadayada) where await fsPromise.readFile(yadayada) , который работает в console.log. Почему я не могу этого сделать, в этом нет смысла.

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

1. Что именно не так в after assignment and value of tempPosts in asyncForEach: выводе? Я не могу определить проблему.

2. В нем должно отображаться поле с ключом, называемым data, с данными в нем. Как в буфере данных, показанном в console.log.

3. Черт возьми, tempPost.data = await ... было бы проще. Что, если вы сделаете console.log(tempPost.data) вместо console.log(tempPosts) ? Также, что это за объекты? Возможно, у них уже есть специальное data свойство, которое нельзя перезаписать?

4. Да, я пытался использовать tempPost.data вместо этого с аналогичными результатами. Эти объекты являются моделями mongoose, в частности, без записей данных. Я предполагаю, что моим следующим шагом будет создание экземпляра моделей mongoose с пустыми записями данных и проверка, не препятствует ли назначению отсутствие записи при инициализации.

Ответ №1:

Я только что провел небольшой тест, и кажется, что вы должны быть в состоянии увидеть выходные данные, если в вашем случае вы попытаетесь извлечь свойство ‘data’ для печати:

 console.log('after assignment and value of tempPost in asyncForEach: ',tempPosts[tempPosts.indexOf(tempPost)]['data'])

  

Однако попытка console.log(tempPost) не будет отображаться data , если вы не определили этот ключ в схеме mongoose вашего temppost’а

Если вы хотите управлять tempPost как обычным объектом javascript, вам нужно преобразовать документ модели tempPost в простой объект JavaScript, вызвав toObject , например. tempPost = tempPost.toObject(); после этого ваш console.log('after assignment and value of tempPosts in asyncForEach: ', tempPosts) выдаст ожидаемый результат.

Так что на самом деле это не имеет ничего общего с асинхронностью / ожиданием и назначением, imo

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

1. Ответ, по-видимому, заключался в том, что вы не можете добавить значение к объекту, даже если он извлекается из схемы Mongoose. Неинтуитивно, поскольку я думал, что это возможно, пока вы читаете значение, но, по-видимому, это не так.