节点Js承诺

时间:2017-10-24 03:37:01

标签: javascript node.js asynchronous

我正在使用node.js的mongoose,我正在尝试为每个用户生成令牌。

这里我无法理解第一个return语句和第二个return语句发生了什么。

有人可以帮助我控制流程。

UserSchema.methods.generateAuthToken = function(){
 var user = this;
 var access = 'auth';
 var token =jwt.sign({ _id : user._id.toHexString(),access},'123abc');
 user.tokens.push({access,token});
  return user.save().then(()=>{
       return token;
    })
};

3 个答案:

答案 0 :(得分:0)

UserSchema.methods.generateAuthToken = function(){ // ES5 classic function
 var user = this; // you keep the context in a var
 var access = 'auth'; 
 var token = jwt.sign({ _id : user._id.toHexString(),access},'123abc'); // you call jwt.sign() function
 user.tokens.push({access,token}); // you push some data in user.tokens array
  return user.save().then( () => { // Promise then ES6 arrow function equivalent to function(){ /* do something */ };
       return token; // you return token to your promise
    }); // you return token through user.save()
};

更多:

承诺:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

ES6箭头功能:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

希望它清楚。

答案 1 :(得分:0)

user.save是一个异步调用。第一个return语句返回一个promise,告诉调用者结果尚未知晓。第二个回报是您通过承诺返回的实际值。你可能想稍微探讨一下承诺。

答案 2 :(得分:0)

user.save()将用户保存到数据库中,该数据库将返回一个promise,如果成功,则将返回令牌。

BTW将推送更新为: user.tokens = user.tokens.concat([{access,token}]);

与MongoDB上不同版本的兼容性更高