【发布时间】:2021-01-31 18:32:31
【问题描述】:
我正在构建一个 api 并尝试使用 req.cookie 创建一些 cookie。
最初我遇到了一个问题,因为在我的同步代码中发出响应之前,cookie 并未全部设置好:
const createTokensAndCookies = catchAsync(async (req, res) => {
const promises = [];
promises.push(jwtToken.sign({ id: req.user._id }));
promises.push(jwtRefreshToken.create());
promises.push(csrfToken.create());
const tokens = await Promise.all(promises);
//create coookies
jwtCookie.create(req, res, tokens[0]);
jwtRefreshCookie.create(req, res, tokens[1]);
csrfCookie.create(req, res, tokens[2]);
});
然后在路由处理程序中调用此函数,并在下一行调用res.send()。
为了解决我提出的问题 createTokensAndCookies 返回一个承诺。所以我的代码是:
const createTokensAndCookies = catchAsync(async (req, res) => {
const promises = [];
promises.push(jwtToken.sign({ id: req.user._id }));
promises.push(jwtRefreshToken.create());
promises.push(csrfToken.create());
const tokens = await Promise.all(promises);
//create coookies
return new Promise((resolve, reject) => {
jwtCookie.create(req, res, tokens[0]);
jwtRefreshCookie.create(req, res, tokens[1]);
csrfCookie.create(req, res, tokens[2]);
resolve();
});
});
路由处理程序:
exports.signUp = catchAsync(async (req, res, next) => {
//get only certain variables out of req object
const { body } = req;
const user = await User.create({
name: body.name,
email: body.email,
password: body.password,
passwordConfirmation: body.passwordConfirmation,
});
req.user = user;
createTokensAndCookies(req, res).then(() => {
res.status(201).json({
status: 'success',
});
});
});
还有catchAsync 包装器:
module.exports = (fn) => (req, res, next) => {
fn(req, res, next).catch(next);
};
我现在收到以下错误:
Cannot read property 'then' of undefined
有趣的是,当我删除 catchAsync 包装器时,一切正常,并且在创建所有 cookie 之前不会发送响应。
有谁知道我如何在保持catchAsync warpper 的同时做到这一点?解释为什么删除 catchAsync 包装器可以解决问题也很好。
【问题讨论】:
-
"为了解决我让
createTokensAndCookies返回一个承诺的问题" -async函数已经确实返回了一个承诺(它是使用await),添加return new Promise((resolve, reject) => { … resolve(); });并没有任何改变。 -
"有谁知道我如何在保持
catchAsyncwarpper 的同时做到这一点?" - 不,这没有任何意义。为什么要将它保留在createTokensAndCookies定义附近?您应该只在路由处理程序周围使用catchAsync。
标签: javascript node.js asynchronous promise