return 来自回调的外部变量不起作用
return outter variable from callback is not work
我需要 return 来自 userService.signIn() 的新状态
但是 return 仍然 { httpStatus: 500, message: undefined, errorMessage: undefined }
如何获取当前结果?
{
httpStatus: 200,
message: {
auth: true,
token,
message: 'user found & logged in'
}
}
// user-service.js
module.exports = (db) => {
return {
signIn: function (req, res, next) {
const result = { httpStatus: 500, message: undefined, errorMessage: undefined };
passport.authenticate('local-comparePassword', {}, (err, user, info) => {
if (err) {
console.error(err);
}
if (info !== undefined) {
console.error(`Info Message Error: ${info.message}`);
if (info.message !== 'Username or Password is incorrect') {
console.log(info.message)
result.httpStatus = 401;
result.errorMessage = info.message;
} else if (!user) {
console.log(info.message)
result.httpStatus = 204;
result.message = 'User not found';
} else {
console.log(info.message)
result.httpStatus = 400;
result.errorMessage = info.message;
}
} else {
const token = jwt.sign(
{ id: user.id, role: user.role, name: user.name },
jwtOptions.secretOrKey,
{ expiresIn: 3600 }
);
result.httpStatus = 200;
result.message = {
auth: true,
token,
message: 'user found & logged in'
};
}
return result;
})(req, res, next);
// return result
},
}
}
// user-controller.js
module.exports = (db) => {
return {
signIn: async (req, res, next) => {
try {
const result = await userService(db).signIn(req, res, next)
console.log('result', result) **// result undefined**
if (res.httpStatus === 200 || result.httpStatus === 400 || result.httpStatus === 401) {
res.status(result.httpStatus).json({ message: result.message });
} else {
res.status(result.httpStatus).json({ errorMessage: 'error' });
}
} catch (ex) {
console.log(ex.message);
res.status(400).json({ errorMessage: ex.message })
}
}
}
}
没有运行你的代码,但正如我所见:
- 为什么您在
userService().signIn()
中注释掉了 return result
?因此 // result undefined
。好的,假设您的代码与您的问题有点不同步。
- 但是,如果您的意愿
return result
来自 userService().signIn()
(如您所愿),那将不会白费 - passport.authenticate()
异步调用您的回调 after userService().signIn()
returns
return result
内部 passport.authenticate() 回调将 return 结果为 passport.authenticate(),而不是你的 userService().signIn()
,而且,它会在signIn
returns 之后发生
- 您必须将
signIn
声明为 async function(...)
- await
中没有 return 一个 Promise
[=41 的函数是没有意义的=]
- 为此,您还需要将
passport.authenticate()
本身转换为异步函数。是这样的:
new Promise((resolve, reject) => {
passport.authenticate(..., (err, user, info) => {
// ...
if (err) reject(err);
if (user) resolve(user);
}
}
- 然后你可以
signIn: async function(req, res, next) {
const result = { httpStatus: 500, message: undefined, errorMessage: undefined }
return await new Promise((resolve, reject) => {
passport.authenticate(..., (err, user, info) => {
// ...
resolve(result);
}
}
}
接着
await userService(db).signIn()
我需要 return 来自 userService.signIn() 的新状态
但是 return 仍然 { httpStatus: 500, message: undefined, errorMessage: undefined }
如何获取当前结果?
{
httpStatus: 200,
message: {
auth: true,
token,
message: 'user found & logged in'
}
}
// user-service.js
module.exports = (db) => {
return {
signIn: function (req, res, next) {
const result = { httpStatus: 500, message: undefined, errorMessage: undefined };
passport.authenticate('local-comparePassword', {}, (err, user, info) => {
if (err) {
console.error(err);
}
if (info !== undefined) {
console.error(`Info Message Error: ${info.message}`);
if (info.message !== 'Username or Password is incorrect') {
console.log(info.message)
result.httpStatus = 401;
result.errorMessage = info.message;
} else if (!user) {
console.log(info.message)
result.httpStatus = 204;
result.message = 'User not found';
} else {
console.log(info.message)
result.httpStatus = 400;
result.errorMessage = info.message;
}
} else {
const token = jwt.sign(
{ id: user.id, role: user.role, name: user.name },
jwtOptions.secretOrKey,
{ expiresIn: 3600 }
);
result.httpStatus = 200;
result.message = {
auth: true,
token,
message: 'user found & logged in'
};
}
return result;
})(req, res, next);
// return result
},
}
}
// user-controller.js
module.exports = (db) => {
return {
signIn: async (req, res, next) => {
try {
const result = await userService(db).signIn(req, res, next)
console.log('result', result) **// result undefined**
if (res.httpStatus === 200 || result.httpStatus === 400 || result.httpStatus === 401) {
res.status(result.httpStatus).json({ message: result.message });
} else {
res.status(result.httpStatus).json({ errorMessage: 'error' });
}
} catch (ex) {
console.log(ex.message);
res.status(400).json({ errorMessage: ex.message })
}
}
}
}
没有运行你的代码,但正如我所见:
- 为什么您在
userService().signIn()
中注释掉了return result
?因此// result undefined
。好的,假设您的代码与您的问题有点不同步。 - 但是,如果您的意愿
return result
来自userService().signIn()
(如您所愿),那将不会白费 -passport.authenticate()
异步调用您的回调 afteruserService().signIn()
returns return result
内部 passport.authenticate() 回调将 return 结果为 passport.authenticate(),而不是你的userService().signIn()
,而且,它会在signIn
returns 之后发生
- 您必须将
signIn
声明为async function(...)
-await
中没有 return 一个Promise
[=41 的函数是没有意义的=] - 为此,您还需要将
passport.authenticate()
本身转换为异步函数。是这样的:new Promise((resolve, reject) => { passport.authenticate(..., (err, user, info) => { // ... if (err) reject(err); if (user) resolve(user); } }
- 然后你可以
接着signIn: async function(req, res, next) { const result = { httpStatus: 500, message: undefined, errorMessage: undefined } return await new Promise((resolve, reject) => { passport.authenticate(..., (err, user, info) => { // ... resolve(result); } } }
await userService(db).signIn()