mongoosejs返回带有更改后的对象的model.find

时间:2019-02-16 17:34:06

标签: javascript node.js mongoose promise bluebird

查询猫鼬模型并将更改后的对象传递到下一个Promise链时遇到问题。

查询确实传递到下一个.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 :(得分:1)

您在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);
  }
}
相关问题