Javascript mongoosejs返回一个model.find和一个修改过的对象
我在查询我的mongoose模型并将修改过的对象传递给下一个承诺链时遇到了问题 查询确实会传递到下一个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
。然后
,但没有我新分配的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
只会传播到第二个外部。然后()
如果它是从嵌套的返回的。然后()
。