PCDotFan

To be an life & code artisan

AdonisJS 初体验

JavaScript 0 评

本菜鸡又跳进了 Node.js 的新坑里,本来是乖乖地照着 N-Blog 的教程,先试着用 Express 写一个小博客……结果还是耐不住性子,翻 GitHub 的时候发现了这个框架:

打开文档一看,卧槽这不就是 Node 版的 Laravel 么!LucidEloquentAceArtisan,连这文档的编排也是赤果果地参照 Laravel 来设计的…… 先 Clone 为敬。实在不太理解的是完善程度这么高的一个项目竟然只有 3k 个 Stars

感受

  • 思路上和 Laravel 完全一致,之前从 Laravel 上过来的用户想必不要太开心。不管是从逻辑上和代码上都可以平滑迁移,不需要费太大力气就能给项目冠上一个高性能的头衔,美滋滋
  • 初学 express 时总觉得给一个项目各种东拼西凑 middleware 实在有些不适应。如果我只是想做一个小项目、抑或是要应对快速开发——无疑 Rails、Laravel 这类框架 全家桶 般的设计更适合我。
  • 全栈、全栈、全栈,哦还有 SPA、SPA、SPA
  • 社区不太活跃,用户基数小,遇到问题基本上只能自己 Debug

AdonisJS Auth Example

顺便备份一下今天做的 AdonisJS 基本登录和注册。 用到的路由:

Route.group(() => {
  Route.get('register', 'AuthController.showRegisterPage')
  Route.post('register', 'AuthController.register')
  Route.get('login', 'AuthController.showLoginPage')
  Route.post('login', 'AuthController.login')
}).middleware(['guest'])

Route.group(() => {
  Route.get('logout', 'AuthController.logout')
}).middleware(['auth'])

AuthController

'use strict'

const User = use('App/Models/User')
const { validate } = use('Validator')


class AuthController {

  /**
   * Show register page
   */
  showRegisterPage({ view }) {
    return view.render('auth.register')
  }

  /**
   * Show login page
   */
  showLoginPage({ view }) {
    return view.render('auth.login')
  }

  /**
   * Handle user registration
   */
  async register({ auth, request, response, session }) {
    const rules = {
        username: 'required|unique:users',
        email: 'required|email|unique:users',
        password: 'required',
        password_confirmation: 'required_if:password|same:password',
    }
    const data = request.all()
    const validation = await validate(data, rules)

    // show error messages upon validation fail
    if (validation.fails()) {
      session
        .withErrors(validation.messages())
        .flashExcept(['password'])

      return response.redirect('back')
    }

    // persist to database
    const user = await User.create({
      username: data.username,
      email: data.email,
      password: data.password
    })

    // login the user
    await auth.login(user)

    // redirect to homepage
    response.redirect('/')
  }

  async login({ auth, request, response, session }) {
    const email = request.input('email')
    const password = request.input('password')

    try {
      await auth.attempt(email, password)
      return response.redirect('/')
    } catch (e) {
      session.flash({ error: 'We cannot find any account with these credentials.' })
      return response.redirect('back')
    }
  }

  async logout({ auth, request, response }) {
      await auth.logout()
      response.redirect('/login')
  }
}

module.exports = AuthController

最后就是防止已登录用户访问注册、登录页面的 Middleware RedirectIfAuthenticated

'use strict'

class RedirectIfAuthenticated {
  async handle ({ auth, request, response }, next) {
    /**
     * Verify if we are logged in.
     *
     * ref: http://adonisjs.com/docs/4.0/authentication#_check
     */
    try {
      await auth.check()

      return response.redirect('/')
    } catch (e) {}

    await next()

  }
}

module.exports = RedirectIfAuthenticated