mongoose异步操作造成ctx.body不正常,求解决
发布于 8 年前 作者 bringtree 4985 次预览 最后一次回复是 8 年前 来自 问答
router.post('/user/api/add', async (ctx,next) => {
var username = ctx.session.current_user.username;
var oldAccount = "";
var account = {
thing: ctx.request.body.thing,
date: ctx.request.body.date,
status: ctx.request.body.status,
money: ctx.request.body.money
};
var resBody={};
await UserModel.findByUsername(username, function (err, doc) {
if (doc) {
oldAccount = doc.accounts;
oldAccount.push(account);
} else {
console.log(err);
resBody = {
type: "fail",
message: "please check out your login status or input"
}
}
return resBody;
})
UserModel.addAccount(username, oldAccount, function (err, doc) {
if (doc) {
resBody = {
type: "success",
message: "input success"
}
console.log(resBody)
}
else {
console.log(err);
resBody = {
type: "fail",
message: "please check out your login status or input"
}
}
});
ctx.body = resBody
//ctx.body="上面数据库操作是能进行 但是由于异步问题 我实在无法解决 ctx.body ={}";
});```
下面是上面那2个函数
UserSchema.statics.findByUsername = function (username, cb) { return this.findOne({username: username}, cb); }
UserSchema.statics.addAccount = function(username,account,cb){ return this.findOneAndUpdate({username:username},{“accounts”:account},cb); }```
7 回复
之前 采用过 function*(next){ yield XX.exec(); this.body = abc; } 但是 这里我用了 也没用
用bluebird 的Promise.promisify 提示 mongoose this.parse 错误
说下我自己的用mongoose的方案。
配置数据库连接需要配置:
mongoose.Promise = global.Promise;model层写方法:
然后你在
用了await又用callback,显然没必要。
@nullcc 我调试了程序 运行时这样子的 他先route运行完(这时候如果没有ctx.body 就默认返回404,如果有就直接丢个空,因为这时候外面 2个mongoose操作还没执行。) 再去执行外面 2个mongoose的函数(这时候在回调中加ctx.body也没用了)。。我对无法await理解,我认为await 是 可以阻塞这个函数 等待 mongoose 操作完毕的。 我想问下 如果我现在这个要如何改?
正常情况下,await命令后面是一个 Promise 对象
@jiangli373 谢谢了, 但是 我还是搞不懂 await 对generator 到底是做了 什么 有比较 好的文章吗 或 介绍吗
@bringtree http://es6.ruanyifeng.com/#docs/async