mongoosejs return 一个 model.find 有一个改变的对象

mongoosejs return a model.find with an altered object

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

查询确实传递给下一个 .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 );
  })

您在此处 return Stack.findOne( { _id: req.params.id }, function 使用回调,并且 return stack 没有更改下一个 then。您可以获得 stack 仅在该回调内进行更改,或者通过在 Stack.findOne:

之后添加 then
// 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);
  }
}