求教 koa2 异步重定向的问题.
发布于 8 年前 作者 ench44 4904 次浏览 来自 问答

自己学习模仿某视频站的示例, 课程用的是express, 我想修改成koa2的.遇到了好多坑. 问题如下; //用户注册 exports.signin = async (ctx, next) => { var _user = ctx.request.body.user var name = _user.name var password = _user.password

User.findOne({name: name}, function (err, user) {
	if (err) {
		console.log(err)
	}

	if (!user) {
		console.log('用户不存在')
		ctx.redirect('/admin/list');
	}

	user.comparePassword(password, user.password, function (err, ismatch) {
		if (err) {
			console.log(err)
		}

		if (ismatch) {
			console.log('password is matched')
			ctx.redirect('/admin/list');
		} else {
			console.log('password is not matched')
		}
	})
})

} // user.comparePassword 自定义的实例方法 UserSchema.methods = { comparePassword: function (_password, hash, cb) {

	bcrypt.compare(_password, hash, function (err, ismatch) {
		if (err) {
			return cb(err)
		}
		cb(null, ismatch)
	})
}

} 代码运行到 if (ismatch) { console.log(‘password is matched’) ctx.redirect(’/admin/list’); } 就会报错, xxxxxx 求达人告知正确的姿势…这个问题困扰我很久,求助,在线等

8 回复

包promise就好了

i5ting 请问这个该怎么包啊…能不能帮帮忙…

@ench44

User.findOne({name: name}, function (err, user) {

改成promise写法。

function xxxx(){
     return new Promise(function(resolve, reject){
	     User.findOne({name: name}, function (err, user) {
		    if(err) reject(err)
			resolve(user)
		 })
	 
	 })

}

然后利用koa2中间件原理

return xxxx().then(next).then(function(){
    // after
})

大意就是这样

@i5ting 太感谢你了! 我研究研究

可能对 Express 和 Koa 的编程模型不太熟悉吧。前者是 callback 友好型的,后者是 Promise 友好型的,一个是顺序中间件,一个是洋葱模型的中间件。 现在普遍用 async /await 来写 Koa 了

@DevinXian Koa2的三种中间件最好都掌握

@i5ting 桑大提醒的是

@i5ting 研究了一天,一晚上. 依然头痛没解决, 很慌. 狼哥, 既然写了一个小demo, 何不直接把demo中user的那一部分写的更完整一些, 比如写一个user的curd,注册登录.抱歉,不知道这中要求过分不. 我想这样可以帮助更多的新手…至少一定能帮到我 …

回到顶部