router.js router.get(’/register/registerStep3’, initMiddleware, controller.default.pass.registerStep3); router.post(’/pass/doRegister’, initMiddleware, controller.default.pass.doRegister);modelapp/model/user.jsmodule.exports = app => { const mongoose = app.mongoose; const Schema = mongoose.Schema; var d = new Date(); const User = new Schema({ password: { type: String }, phone: { type: Number }, last_ip: { type: String }, add_time: { type: Number, default: d.getTime() }, email: { type: String }, status: { type: Number, default: d.getTime() } }); return mongoose.model(‘User’, User, ‘user’);}注册页面controllerapp/controller/default/pass.js async registerStep3() { var sign = this.ctx.request.query.sign; var phone_code = this.ctx.request.query.phone_code; var msg = this.ctx.request.query.msg || ‘’; var add_day = await this.service.tools.getDay(); //年月日 var userTempResult = await this.ctx.model.UserTemp.find({ “sign”: sign, add_day: add_day }); if (userTempResult.length == 0) { this.ctx.redirect(’/register/registerStep1’); } else { await this.ctx.render(‘default/pass/register_step3.html’, { sign: sign, phone_code: phone_code, msg: msg }); } }viewappviewdefaultpassregister_step3.html <form action="/pass/doRegister?_csrf=<%=csrf%>" method=“post” id=“form”> <input type=“hidden” name=“sign” value="<%=sign%>" /> <input type=“hidden” name=“phone_code” value="<%=phone_code%>" /> <div> <input class=“form_input” type=“password” id=“password” name=“password” placeholder=“请输入密码” /> </div> <div> <input class=“form_input” type=“password” id=“rpassword” name=“rpassword” placeholder=“请输入确认密码” /> </div> <%if(msg){%> <p style=“color:red”> <%=msg%> </p> <%}%> <div class=“regist_submit”> <input class=“submit” id=“nextStep” type=“submit” name=“submit” value=“下一步”> </div> </form> $(function() { $("#form").submit(function() { var password = $(’#password’).val(); var rpassword = $(’#rpassword’).val(); if (password.length < 6) { alert(‘用户名的长度不能小于6位’); return false; } if (password != rpassword) { alert(‘密码和确认密码不一致’); return false; } return true; }) })效果提交注册,跳转到首页controllerapp/controller/default/pass.js async doRegister() { var sign = this.ctx.request.body.sign; var phone_code = this.ctx.request.body.phone_code; var add_day = await this.service.tools.getDay(); //年月日 var password = this.ctx.request.body.password; var rpassword = this.ctx.request.body.rpassword; var ip = this.ctx.request.ip.replace(/::ffff:/, ‘’); if (this.ctx.session.phone_code != phone_code) { //非法操作 this.ctx.redirect(’/pass/registerStep1’); } var userTempResult = await this.ctx.model.UserTemp.find({ “sign”: sign, add_day: add_day }); if (userTempResult.length == 0) { //非法操作 this.ctx.redirect(’/pass/registerStep1’); } else { //传入参数正确 执行增加操作 if (password.length < 6 || password != rpassword) { var msg = ‘密码不能小于6位并且密码和确认密码必须一致’; this.ctx.redirect(’/register/registerStep3?sign=’ + sign + ‘&phone_code=’ + phone_code + ‘&msg=’ + msg); } else { var userModel = new this.ctx.model.User({ phone: userTempResult[0].phone, password: await this.service.tools.md5(password), last_ip: ip }) //保存用户 var userReuslt = await userModel.save(); if (userReuslt) { //获取用户信息 var userinfo = await this.ctx.model.User.find({ “phone”: userTempResult[0].phone }, ‘_id phone last_ip add_time email status’) //用户注册成功以后默认登录 //cookies 安全 加密 this.service.cookies.set(‘userinfo’, userinfo[0]); this.ctx.redirect(’/’); } } } }中间件app/middleware/init.js ctx.state.csrf = ctx.csrf; //全局变量 //获取用户信息 ctx.state.userinfo = ctx.service.cookies.get(‘userinfo’);viewapp/view/default/public/header.html <%if(userinfo && userinfo.phone){%> <li> <a href="#"> <%=userinfo.phone%> </a> </li> <%}%>效果