mongoosejs возвращает model.find с измененным объектом - PullRequest
0 голосов
/ 16 февраля 2019

У меня проблема с запросом модели мангуста и передачей измененного объекта в следующую цепочку обещаний.

Запрос передается следующему .then, но без моего недавно назначенного spaceTempName.

Есть идеи, как решить эту проблему?

  // promise - search for workspace ...
  var promise = Space.findOne( spaceId ).exec();

  promise.then( function ( space ) {

     return Stack.findOne( { _id: req.params.id }, function( err , stack ) {
          stack.spaceTempName = space.name;
          stack.name = 'test';

          console.log( stack );
          return stack;
      });
  })
  .then( function ( stack ) {

      console.log( stack );
  })

1 Ответ

0 голосов
/ 16 февраля 2019

Вы используете обратный вызов здесь return Stack.findOne( { _id: req.params.id }, function и возвращаете stack без изменений для следующего then.Вы можете получить stack с изменениями только внутри этого обратного вызова или добавив then после Stack.findOne:

// promise - search for workspace ...
var promise = Space.findOne( spaceId ).exec();

promise.then( function (space) {

  return Stack.findOne( { _id: req.params.id })
    .then(function (stack) {
      stack.spaceTempName = space.name;
      stack.name = 'test';

      console.log(stack);
      return stack;
    })
    .catch(function (err) { console.log(err) });
})
.then( function (stack) {

  console.log(stack);
})
.catch(function(err) { console.log(err) });

Или, что еще лучше для удобства чтения, вы можете поместить его в функцию async и использовать await:

const updateSpaceName = async (req, res) => {
  try {
    // promise - search for workspace ...
    promise = Space.findOne( spaceId ).exec();

    const space = await promise();

    const stack = await Stack.findOne( { _id: req.params.id } );

    stack.spaceTempName = space.name;
    stack.name = 'test';
    console.log( stack );

    // here you can pass stack to another promise
    // and it will have changed name
    await nextTestPromise(stack);

  } catch (err) {
    console.log(err);
  }
}
...