老师,我把代码贴出来,问题:1验证过期时间停止在1秒,过时也不能重复验证;2注册和登录都没有反应

来源:10-2 切换城市(2)

行于脚下

2018-12-11

// @/pages/register.vue

//@/server/utils/passport.js
import Router from 'koa-router’
import Redis from ‘koa-redis’
// 郵箱驗證
// 短信驗證
import nodeMailer from ‘nodemailer’
// https://github.com/rkusa/koa-passport
import passport from '…/utils/passport’
import axios from '…/utils/axios.js’
import Account from '…/models/Account.js’
import Email from ‘…/dbconfig.js’

const router = new Router({
prefix: ‘/users’
})

const Store = new Redis().client

router.post(’/register’, async ctx => {
// ctx.body报错
const {username, password, email, code} = ctx.request.body

if (code) {
const saveCode = await Store.hget(nodemail:${username}, ‘code’)
const saveExpire = await Store.hget(nodemail:${username}, ‘expire’)

if (code === saveCode) {
  if (new Date().getTime() > saveExpire) {
    ctx.body = {
      code: -1,
      msg: '验证码已过期,请重新尝试'
    }
    return false
  }
} else {
  ctx.body = {
    code: -1,
    msg: '请填写正确的验证码'
  }
}

} else {
ctx.body = {
code: -1,
msg: ‘请填写验证码’
}
}

const user = await Account.find({
username
})

if (user.length) {
ctx.body = {
code: -1,
msg: ‘已被注册’
}
return
}
// 创建新账户
const newAccount = await Account.create({
username,
password,
email
})

if (!newAccount) {
ctx.body = {
code: -1,
msg: ‘注册失败’
}
} else {
const res = await axios.post(’/users/login’, {
username,
password
})

if (res.data && res.data.code === 0) {
  ctx.body = {
    code: 0,
    msg: '注册成功',
    user: res.data.user
  }
} else {
  ctx.body = {
    code: -1,
    msg: 'error'
  }
}

}
})

// router.post(’/login’,
// passport.authenticate(‘local’, { failureRedirect: ‘/login’ }),
// ctx => ctx.redirect(’/’)
// )
router.post(’/custom’, (ctx, next) => {
return Passport.authenticate(‘local’, (err, user, info, status) => {
if (err) {
ctx.body = {
code: -1,
msg: err
}
} else {
if (user) {
ctx.body = {
code: 0,
msg: ‘登录成功’,
user
}
return ctx.login(user)
} else {
ctx.body = {
code: 1,
msg: info
}
}
}
})(ctx, next)
})

router.post(’/verify’, async (ctx, next) => {
const username = ctx.request.body.username
const saveExpire = await Store.hget(nodemail:${username}, ‘expire’)

if (saveExpire && new Date().getTime() < saveExpire) {
ctx.body = {
code: -1,
msg: ‘验证请求过于频繁,1分钟内1次’
}
return false
}

const transporter = nodeMailer.createTransport({
service: ‘qq’,
auth: {
user: Email.smtp.user,
pass: Email.smtp.pass
}
})

const ko = {
code: Email.smtp.code,
expire: Email.smtp.expire,
email: ctx.request.body.email,
user: ctx.request.body.username
}

const mailOptions = {
from: "认证邮件" <${Email.smtp.user}>,
to: ko.email,
subject: ‘track注册码’,
html: 您在"track网站"中注册,您的邀请码是${ko.code}
}

await transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error)
} else {
Store.hmset(nodemail:${ko.user}, ‘code’, ko.code, ‘expire’, ko.expire, ‘email’, ko.email)
}
})

ctx.body = {
code: 0,
msg: ‘验证码已发送,可能会有延时,有效期1分钟’
}
})

router.get(’/logout’, ctx => {
ctx.logout()
ctx.redirect(’/’)
})

router.get(’/getUser’, ctx => {
if (ctx.isAuthenticated()) {
const {username, email} = ctx.session.passport.user
ctx.body = {
user: username,
email
}
} else {
ctx.body = {
user: ‘’,
email: ‘’
}
}
})

export default router

// @/server/interface/users.js
import Router from 'koa-router’
import Redis from ‘koa-redis’
// 郵箱驗證
// 短信驗證
import nodeMailer from ‘nodemailer’
// https://github.com/rkusa/koa-passport
import passport from '…/utils/passport’
import axios from '…/utils/axios.js’
import Account from '…/models/Account.js’
import Email from ‘…/dbconfig.js’

const router = new Router({
prefix: ‘/users’
})

const Store = new Redis().client

router.post(’/register’, async ctx => {
// ctx.body报错
const {username, password, email, code} = ctx.request.body

if (code) {
const saveCode = await Store.hget(nodemail:${username}, ‘code’)
const saveExpire = await Store.hget(nodemail:${username}, ‘expire’)

if (code === saveCode) {
  if (new Date().getTime() > saveExpire) {
    ctx.body = {
      code: -1,
      msg: '验证码已过期,请重新尝试'
    }
    return false
  }
} else {
  ctx.body = {
    code: -1,
    msg: '请填写正确的验证码'
  }
}

} else {
ctx.body = {
code: -1,
msg: ‘请填写验证码’
}
}

const user = await Account.find({
username
})

if (user.length) {
ctx.body = {
code: -1,
msg: ‘已被注册’
}
return
}
// 创建新账户
const newAccount = await Account.create({
username,
password,
email
})

if (!newAccount) {
ctx.body = {
code: -1,
msg: ‘注册失败’
}
} else {
const res = await axios.post(’/users/login’, {
username,
password
})

if (res.data && res.data.code === 0) {
  ctx.body = {
    code: 0,
    msg: '注册成功',
    user: res.data.user
  }
} else {
  ctx.body = {
    code: -1,
    msg: 'error'
  }
}

}
})

// router.post(’/login’,
// passport.authenticate(‘local’, { failureRedirect: ‘/login’ }),
// ctx => ctx.redirect(’/’)
// )
router.post(’/custom’, (ctx, next) => {
return Passport.authenticate(‘local’, (err, user, info, status) => {
if (err) {
ctx.body = {
code: -1,
msg: err
}
} else {
if (user) {
ctx.body = {
code: 0,
msg: ‘登录成功’,
user
}
return ctx.login(user)
} else {
ctx.body = {
code: 1,
msg: info
}
}
}
})(ctx, next)
})

router.post(’/verify’, async (ctx, next) => {
const username = ctx.request.body.username
const saveExpire = await Store.hget(nodemail:${username}, ‘expire’)

if (saveExpire && new Date().getTime() < saveExpire) {
ctx.body = {
code: -1,
msg: ‘验证请求过于频繁,1分钟内1次’
}
return false
}

const transporter = nodeMailer.createTransport({
service: ‘qq’,
auth: {
user: Email.smtp.user,
pass: Email.smtp.pass
}
})

const ko = {
code: Email.smtp.code,
expire: Email.smtp.expire,
email: ctx.request.body.email,
user: ctx.request.body.username
}

const mailOptions = {
from: "认证邮件" <${Email.smtp.user}>,
to: ko.email,
subject: ‘track注册码’,
html: 您在"track网站"中注册,您的邀请码是${ko.code}
}

await transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error)
} else {
Store.hmset(nodemail:${ko.user}, ‘code’, ko.code, ‘expire’, ko.expire, ‘email’, ko.email)
}
})

ctx.body = {
code: 0,
msg: ‘验证码已发送,可能会有延时,有效期1分钟’
}
})

router.get(’/logout’, ctx => {
ctx.logout()
ctx.redirect(’/’)
})

router.get(’/getUser’, ctx => {
if (ctx.isAuthenticated()) {
const {username, email} = ctx.session.passport.user
ctx.body = {
user: username,
email
}
} else {
ctx.body = {
user: ‘’,
email: ‘’
}
}
})

export default router

写回答

4回答

fengyunzhu

2019-10-15

过期时间老师设置成1小时了,所以1分钟后不能发送新的验证码

停留在1秒的那个可以在结束时,把提示设置为空

clearInterval(self.timerid)

self.statusMsg = ''


0
0

行于脚下

提问者

2018-12-11

老师,您的邮箱号是什么?

0
0

行于脚下

提问者

2018-12-11

好的,谢谢老师

0
0

快乐动起来呀

2018-12-11

你把代码发我邮箱吧,这样贴代码乱乱的啥也看不出来

0
0

Vue全家桶+SSR+Koa2全栈开发美团网

整合大前端8项技术,全面晋级全栈工程师,毕设/面试作品

2445 学习 · 1638 问题

查看课程