如何通过 API 获得用户
How to get users via API
我的项目中有两个模型:申请人和公司。
创建、验证和删除用户是由同一个 API 完成的。
所以,我有一个中间件,它通过会话 ID 解析用户模型。例如,获取当前用户很有用,首先我们通过其 ID 接收用户,然后发送它。
我的代码如下:
getUserByID(req, res, next) {
if (req.session.user_id) {
async.race([
(callback) => {
Applicant.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
},
(callback) => {
Company.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
}
],
(user) => {
if (user) {
res.locals.currentUser = user;
next()
}
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400)
});
} else {
apiHelper.handleError(res, 'Not authed', 'Please, log in', 400)
}}
我已经测试了这条路线,问题是测试随机通过,随机不通过。我认为这是因为我使用模块异步,或者 smthg 与它
试试这个
getUserByID(req, res, next) {
if (req.session.user_id) {
async.race([
(callback) => {
Applicant.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
},
(callback) => {
Company.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
}
],
(user) => {
if (user) {
res.locals.currentUser = user;
return next(); // added return statement
}
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400)
});
} else {
apiHelper.handleError(res, 'Not authed', 'Please, log in', 400)
}}
最终回调的第一个参数是错误对象(与大多数 async.js
函数一样)。见 example.
也当你这样做
if (user) {
res.locals.currentUser = user;
next();
}
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400); // *
如果找到用户,最后一行仍然会被执行。确保执行 return next();
或使用 if/else
.
我将重构您的代码如下。 async.js
的美妙之处在于您可以将错误处理整合到一个地方。
getUserByID(req, res, next) {
if (req.session.user_id) {
async.race([
callback => Applicant.findById(req.session.user_id, callback),
callback => Company.findById(req.session.user_id, callback)
],
(err, user) => {
// note the use of return to prevent execution of any following lines
if (err)
return apiHelper.handleError(res, 'Unknown error', 'Can not find user', 500);
if (!user)
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400);
res.locals.currentUser = user;
next();
});
} else {
apiHelper.handleError(res, 'Not authed', 'Please, log in', 400)
}
};
我的项目中有两个模型:申请人和公司。 创建、验证和删除用户是由同一个 API 完成的。 所以,我有一个中间件,它通过会话 ID 解析用户模型。例如,获取当前用户很有用,首先我们通过其 ID 接收用户,然后发送它。 我的代码如下:
getUserByID(req, res, next) {
if (req.session.user_id) {
async.race([
(callback) => {
Applicant.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
},
(callback) => {
Company.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
}
],
(user) => {
if (user) {
res.locals.currentUser = user;
next()
}
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400)
});
} else {
apiHelper.handleError(res, 'Not authed', 'Please, log in', 400)
}}
我已经测试了这条路线,问题是测试随机通过,随机不通过。我认为这是因为我使用模块异步,或者 smthg 与它
试试这个
getUserByID(req, res, next) {
if (req.session.user_id) {
async.race([
(callback) => {
Applicant.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
},
(callback) => {
Company.findOne({_id: req.session.user_id})
.catch(() => {
return apiHelper.handleError(res, 'Unknown error', 'Can not find user')
})
.then(callback)
}
],
(user) => {
if (user) {
res.locals.currentUser = user;
return next(); // added return statement
}
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400)
});
} else {
apiHelper.handleError(res, 'Not authed', 'Please, log in', 400)
}}
最终回调的第一个参数是错误对象(与大多数 async.js
函数一样)。见 example.
也当你这样做
if (user) {
res.locals.currentUser = user;
next();
}
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400); // *
如果找到用户,最后一行仍然会被执行。确保执行 return next();
或使用 if/else
.
我将重构您的代码如下。 async.js
的美妙之处在于您可以将错误处理整合到一个地方。
getUserByID(req, res, next) {
if (req.session.user_id) {
async.race([
callback => Applicant.findById(req.session.user_id, callback),
callback => Company.findById(req.session.user_id, callback)
],
(err, user) => {
// note the use of return to prevent execution of any following lines
if (err)
return apiHelper.handleError(res, 'Unknown error', 'Can not find user', 500);
if (!user)
return apiHelper.handleError(res, 'User not found', 'Can not log in', 400);
res.locals.currentUser = user;
next();
});
} else {
apiHelper.handleError(res, 'Not authed', 'Please, log in', 400)
}
};