我有此代码:
router.put('/test', (ctx, next) => {
post.create(something, (err, newPost) => {
if (err) return
ctx.body = newPost
})
console.log(ctx.body) // => undefined
ctx.status = 200
})
问题是我在回调中为ctx.body变量设置的值在回调之外丢失了。
而且我没有使它起作用。我尝试了bind
/ async await
,但没有成功。
你能帮我吗?
编辑:@CertainPerformance,您链接的“重复项” post不能回答我的问题,因为它提出的解决方案包括直接修改在我的情况下产生承诺post.create
的函数的签名。我不能简单地这样做,因为它是Mongoose API的一部分。我阅读了整个帖子,但没有找到解决方案。那么我们如何处理这篇文章?
编辑:根据以下答案,我找到了两种解决方案:
router.put('/test', async (ctx, next) => {
const newPost = await Post.create(something).then(post => post)
ctx.body = newPost
ctx.status = 200
})
和
router.put('/test', async (ctx, next) => {
const newPost = new Post(something)
await newPost.save()
ctx.body = newPost
ctx.status = 200
})
答案 0 :(得分:0)
例如使用异步/等待:
createPromisified(data) {
return new Promise((resolve, reject) => {
post.create(data, (err, ret) => {
if (err) return reject(err);
return resolve(ret);
});
});
}
router.put('/test', async(ctx, next) => {
await createPromisified(something);
ctx.body = newPost;
ctx.status = 200;
})
使用代表您的情况的通用代码示例:
function postCreate(data, callback) {
setTimeout(() => callback(false, 'ret'), 300);
}
function createPromisified(data) {
return new Promise((resolve, reject) => {
postCreate(data, (err, ret) => {
if (err) return reject(err);
return resolve(ret);
});
});
}
async function routerPut(ctx, next) {
await createPromisified('something');
console.log(ctx.body);
ctx.body = 'newData';
console.log(ctx.body);
ctx.status = 200;
}
routerPut({
body: 'hey',
},
() => {
console.log('next');
},
);