中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在koa2中如何實現頁面渲染的全局數據

發布時間:2021-08-02 10:31:29 來源:億速云 閱讀:168 作者:小新 欄目:web開發

這篇文章主要介紹在koa2中如何實現頁面渲染的全局數據,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

該項目主要用的是傳統的服務端渲染的方式,所以會用 koa-views 去做頁面的渲染工作。實現方式就是 ctx.render('path',data),那么,有如下場景,每個頁面都需要去驗證是否登錄,登錄了要返回頁面個人數據,這個情況,怎么辦呢?我不想每次都去手動的加入個人數據啊。例如這樣:

let data = {
      "user":"12",
      "questionList":questionList
    };
    await ctx.render("index",data);

此處的user就是每個頁面都是要返回的數據。

很顯然,每個頁面都要獲得的數據,用中間件去獲取,類似java的攔截器,過濾器之類的了。

import {UserClient} from "../manager/user/UserClient";
export const signInStatusMiddleware = async (ctx:any,next:any)=>{
  console.log("signInStatusMiddleware")
  let accessToken = ctx.cookies.get("ACCESS-TOKEN");
  if(accessToken){
    let userClient :UserClient = new UserClient;
    let user = await userClient.getUserByToken(accessToken);
  }
  await next();
}

OK,中間件中已經拿到了用戶數據了,那么,問題來了。數據是可以拿,怎么放呢?

找到koa-views 源碼。有如下代碼:

return function views(ctx, next) {
  if (ctx.render) return next()

  ctx.render = function(relPath, locals = {}) {
   return getPaths(path, relPath, extension).then(paths => {
    const suffix = paths.ext
    const state = Object.assign(locals, options, ctx.state || {})
    // deep copy partials
    state.partials = Object.assign({}, options.partials || {})
    debug('render `%s` with %j', paths.rel, state)
    ctx.type = 'text/html'

    if (isHtml(suffix) && !map) {
     return send(ctx, paths.rel, {
      root: path
     })
    } else {
     const engineName = map && map[suffix] ? map[suffix] : suffix

     const render = engineSource[engineName]

     if (!engineName || !render)
      return Promise.reject(
       new Error(`Engine not found for the ".${suffix}" file extension`)
      )

     return render(resolve(path, paths.rel), state).then(html => {
      ctx.body = html
     })
    }
   })
  }

  return next()
 }

關鍵是這一段

const state = Object.assign(locals, options, ctx.state || {})

很顯然,state 是將傳入的數據,合并了,中間件配置的options ,和ctx.state的。中間件顯式配置顯然部合適,所以,做法是,在攔截器中間件中,把user賦值給ctx.state.

export const signInStatusMiddleware = async (ctx:any,next:any)=>{
  console.log("signInStatusMiddleware")
  let accessToken = ctx.cookies.get("ACCESS-TOKEN");
  if(accessToken){
    let userClient :UserClient = new UserClient;
    let user = await userClient.getUserByToken(accessToken);
    ctx.state = Object.assign(ctx.state,{"user":user});
  }
  await next();
}

ok。這樣一來,在頁面渲染的時候,就會帶上用戶信息了。而不需要再在各處去自己手動添加。

以上是“在koa2中如何實現頁面渲染的全局數據”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

koa
AI

惠来县| 安仁县| 宁晋县| 湛江市| 慈利县| 内江市| 来安县| 汾西县| 凤庆县| 遂川县| 祥云县| 安乡县| 元江| 舞阳县| 湟源县| 黄石市| 英吉沙县| 上杭县| 蓬溪县| 渝北区| 泾源县| 象山县| 广昌县| 广东省| 贵阳市| 榆林市| 惠水县| 昭通市| 绥阳县| 台前县| 青冈县| 清苑县| 略阳县| 淮南市| 鲜城| 兰考县| 乌恰县| 阳江市| 应用必备| 全州县| 景泰县|