我在理解为什么会这样做时遇到一些问题:
var userId;
var token;
var result = {};
var merchantId;
userCtrl.loginUser(req.body.email, req.body.password).then(function(data) {
if (data.length == 1) {
userId = data[0].user_id;
return merchantCtrl.isMerchant(userId);
} else {
res.json({
result: 2
});
}
}).then(function(data) {
//If its merchant
if (data.length === 1) {
merchantId = data[0].merchant_id;
token = tokenUtil.createTokenMerchant(merchantId, userId);
result.token = token;
getFullUser(userId).then(function(userObject) {
result.user = userObject;
result.user.user_id = userId;
merchantCtrl.getMerchant(merchantId)
.then(function(data) {
result.merchant = data[0];
res.json(result);
});
});
} else {
token = tokenUtil.createTokenUser(userId);
result.token = token;
return getFullUser(userId);
}
}).then(function(userObject) {
result.user = userObject;
result.user.user_id = userId;
res.json(result);
})
因此,您可以在此代码中看到它缺少最终捕获条件和分号。但是编译得很好,反应也很准确。
现在这里是有趣的部分:getFullUser是一个使用promises获取所有用户信息(duh!)的函数,并且在所有promises解析之后它返回一个包含该用户的Object。
请注意,getFullUser函数不会返回promise。
现在看到这个错误后,我添加了最终的catch和分号:
var userId;
var token;
var result = {};
var merchantId;
userCtrl.loginUser(req.body.email, req.body.password).then(function(data) {
if (data.length == 1) {
userId = data[0].user_id;
return merchantCtrl.isMerchant(userId);
} else {
res.json({
result: 2
});
}
}).then(function(data) {
//If its merchant
if (data.length === 1) {
merchantId = data[0].merchant_id;
token = tokenUtil.createTokenMerchant(merchantId, userId);
result.token = token;
getFullUser(userId).then(function(userObject) {
result.user = userObject;
result.user.user_id = userId;
merchantCtrl.getMerchant(merchantId)
.then(function(data) {
result.merchant = data[0];
res.json(result);
});
});
} else {
token = tokenUtil.createTokenUser(userId);
result.token = token;
return getFullUser(userId);
}
}).then(function(userObject) {
result.user = userObject;
result.user.user_id = userId;
res.json(result);
}).catch(function(error) {
console.log("error: " + error.message + "; code: " + error);
res.status(500).json({
message: "Error logging in."
});
});
运行此错误时出现此错误:
error: Cannot set property 'user_id' of undefined; code: TypeError: Cannot set property 'user_id' of undefined
这表示在将user_id分配给result.user时,用户未定义。 这意味着因为getFullUser上的返回是异步的,所以代码不会等待它的返回而只是使用undefined。
任何人都可以解释为什么会这样吗?
我已经将代码更改为更好的解决方案,但我想知道为什么会发生这种情况。
答案 0 :(得分:0)
catch() - 不是必需的,但强烈推荐。没有捕获 - 你可以丢失错误
getFullUser(userId).then(function(userObject)...
你致电承诺,但没有返回结果(没有等待结果),这就是为什么在下一步,你会收到未定义的'作为下一个块
中的参数设置
return getFullUser(userId).then(function(userObject)