Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongoosejs返回一个model.find和一个修改过的对象_Javascript_Node.js_Mongoose_Promise_Bluebird - Fatal编程技术网

Javascript mongoosejs返回一个model.find和一个修改过的对象

Javascript mongoosejs返回一个model.find和一个修改过的对象,javascript,node.js,mongoose,promise,bluebird,Javascript,Node.js,Mongoose,Promise,Bluebird,我在查询我的mongoose模型并将修改过的对象传递给下一个承诺链时遇到了问题 查询确实会传递到下一个。然后,但没有我新分配的spaceTempName 你知道如何解决这个问题吗 // promise - search for workspace ... var promise = Space.findOne( spaceId ).exec(); promise.then( function ( space ) { return Stack.findOne( { _id

我在查询我的mongoose模型并将修改过的对象传递给下一个承诺链时遇到了问题

查询确实会传递到下一个
。然后
,但没有我新分配的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 );
  })

您在这里使用了一个回调
返回Stack.findOne({u id:req.params.id},函数
,并返回
堆栈
,而不更改下一个
然后
。您可以只在回调内部更改
堆栈
,或者在
堆栈之后添加
然后
。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
函数并使用
wait

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);
  }
}

可能重复的问题我真的不明白这是一个重复的问题。好的,没有解释就不是100%清楚。简而言之,从节点回退返回值没有任何效果。从
回调返回值。然后()
回调将使该值返回到下一个
。然后()
在承诺链中。因此,为了使该链按照您想要的方式运行,
Stack.findOne()
需要按照参考案例3中描述的方式进行“promisified”。至少,这是解决问题的一般方法。Vadi的回答表明,忽略节点回退会导致
Stack.findOne()
返回一个承诺。如果确实如此,那么
Stack.findOne()
已经为您提供了有效的承诺。只需省略节点回退即可获得所需的行为。
Stack
只会传播到第二个外部
。然后()
如果它是从嵌套的
返回的。然后()