рдлреБрд▓рд╕реНрдЯреИрдХ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ Nuxt: рдлреНрд░рдВрдЯрдПрдВрдб + рдмреИрдХрдПрдВрдб рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ (рднрд╛рдЧ 1)

рдлреБрд▓рд╕реНрдЯреИрдХ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ Nuxt: рдлреНрд░рдВрдЯрдПрдВрдб + рдмреИрдХрдПрдВрдб рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░


Nuxt рдбреЗрд╡рд▓рдкрд░реНрд╕ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ 3 рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:

  1. рдореЗрдВ рдирд┐рд░реНрдорд┐рдд Nuxt рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдФрд░ рдЙрдкрдпреЛрдЧ serverMiddleware
  2. рдПрдХреАрдХреГрдд рд░реВрдкрд░реЗрдЦрд╛ ( рдПрдХреНрд╕рдкреНрд░реЗрд╕, рдХреЛрдпрд╛, рд╣рд╛рдкреА , рдЖрджрд┐)
  3. рдмрд╛рд╣рд░реА рд╕рд░реНрд╡рд░ APIs

рдореИрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ API рд╕рд░реНрд╡рд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ serverMiddleware рдЙрд╕реА рдкрд░ Nuxt рдЙрджрд╛рд╣рд░рдг рд╣рдо рджреГрд╢реНрдпрдкрдЯрд▓ рдореЗрдВ рд╣реИред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реИрдВ:

  • рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рд╕реНрдЯреИрдХ рдХреА рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд рдФрд░ рдХрдо рд╕реЗ рдХрдо, рдХреЗрд╡рд▓ Nuxt рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ , рдЬреЛ рдПрдХ рдлреБрд▓рд╕реНрдЯреИрдХ рд╕рд░реНрд╡рд░ рд╣реЛрдЧрд╛ : рдлреНрд░рдВрдЯрдПрдВрдб рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдФрд░ рдмреИрдХрдПрдВрдб рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдирд╛
  • , 1 Node Nuxt, , (Nginx, php ..). - Nuxt - (MySQL, PostgreSQL, MongoDB ..)
  • , . , , .
  • Nuxt Connect, Node () 55 . , Nuxt' (Express, Koa, Hapi ..) .
  • рдЕрддрд┐рд╕реВрдХреНрд╖реНрдорд╡рд╛рдж рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреА рдкреВрд░реА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рд╣реИ, рдХрдИ рдлреБрд▓рд╕реНрдЯреИрдХ Nuxt рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдХрдИ рдлреБрд▓рд╕реНрдЯреИрдХ Nuxt рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рдмреАрдЪ рд▓реЛрдб рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП nginx рдХреЛ рддреИрдирд╛рдд рдХрд░рддреЗ рд╣реИрдВ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рдореВрд▓реА рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ Nuxt рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ API рд╕рд░реНрд╡рд░ (рдХреЗрд╡рд▓ рдмреИрдХреЗрдВрдб рд╕рд░реНрд╡рд░) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдлреНрд░рдВрдЯреЗрдВрдб рд╕рд░реНрд╡рд░ (рдХреЗрд╡рд▓ рдлреНрд░рдВрдЯреЗрдВрдб рд╕рд░реНрд╡рд░)ред
  • рдФрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмреЛрдирд╕ !!! рдлреНрд░рдВрдЯрдПрдВрдб рдФрд░ рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп , рд╕рд░реНрд╡рд░ рдкреЗрдЬ рд░реЗрдВрдбрд░рд┐рдВрдЧ ( SSR ) рдХреЛ рдХрд╛рдлреА рддреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рднрд╛рдЧ 2 рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛

рддреЛ рдЪрд▓реЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИред

1: Nuxt as API Server


  1. /api/ , API
  2. API Server :

    /serverMiddleware/api-server.js
    export default async (req, res, next) => {
      let url = req._parsedUrl.pathname.replace(/^\/+|\/+$|\.+/g, "");
      url = url.split("/");
      let method = url.pop();
      let controller = url.slice(1).join("/");
      let api = require("../api/" + controller);
      let result = await api[method](req.params);
      res.end(JSON.stringify(result));
    };
    
  3. API Server Nuxt serverMiddleware

    /nuxt.config.js
      serverMiddleware: [
        { path: "/api", handler: require("body-parser").json() },
        {
          path: "/api",
          handler: (req, res, next) => {
            const url = require("url");
            req.query = url.parse(req.url, true).query;
            req.params = { ...req.query, ...req.body };
            next();
          }
        },
        { path: "/api", handler: "~/serverMiddleware/api-server.js" }
      ],
    

    http://<server_name>/api/controller_name/method_name /api/ controller_name.js, method_name
  4. users

    /api/users.js
    // we can get data from any DB
    async function getDataFromDB() {
      return (await require("axios").get(`https://reqres.in/api/users?page=1`))
        .data;
    }
    
    async function index() {
      let res = await getDataFromDB();
    
      // some business logic
      let ret = res.data.map(el => {
        return {
          id: el.id,
          full_name: el.first_name + " " + el.last_name,
          highlight: el.first_name.charAt(0) === "J"
        };
      });
      ret = ret.sort(() => 0.5 - Math.random());
    
      return ret;
    }
    
    export { index };
    

    ,

    3gzhl.sse.codesandbox.io/api/users/index
    [
      {
        "id": 3,
        "full_name": "Emma Wong",
        "highlight": false
      },
      {
        "id": 5,
        "full_name": "Charles Morris",
        "highlight": false
      },
      {
        "id": 1,
        "full_name": "George Bluth",
        "highlight": false
      },
      {
        "id": 2,
        "full_name": "Janet Weaver",
        "highlight": true
      },
      {
        "id": 4,
        "full_name": "Eve Holt",
        "highlight": false
      },
      {
        "id": 6,
        "full_name": "Tracey Ramos",
        "highlight": false
      }
    ]
    
  5. index.vue API

    /pages/index.vue
    <template>
      <div>
        <h1 class="title">NUXT as API Server</h1>
        <h2 class="subtitle">Users</h2>
        <button type="button" @click="$fetch">Refresh</button>
        <ol>
          <li
            v-for="user in users"
            :class="{'highlight': user.highlight}"
            :key="user.id"
          >{{ user.full_name }}</li>
        </ol>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          users: []
        };
      },
      async fetch() {
        try {
          this.users = await this.$axios.$get("/api/users/index");
        } catch (e) {
          console.error(e);
          throw e;
        }
      }
    };
    </script>
    
    <style scoped>
    .highlight {
      color: green;
      font-weight: bold;
    }
    </style>
    

    тАФ 3gzhl.sse.codesandbox.io



    fetch , HTTP (https://3gzhl.sse.codesandbox.io/api/users/index), API json, .

    Refresh, http API .
  6. :

    API users (/api/users.js)

    ...
    async function show({ id }) {
      let res = await getDataFromDB();
    
      return res.data.filter(el => el.id == id)[0];
    }
    
    export { index, show };
    

    users

    /pages/index.vue
    <template>
      <div>
        <h1 class="title">NUXT as API Server</h1>
        <h2 class="subtitle">Users</h2>
        <button type="button" @click="$fetch">Refresh</button>
        <ol>
          <li
            v-for="user in users"
            :class="{'highlight': user.highlight}"
            :key="user.id"
            @click="getUserInfo(user.id)"
          >{{ user.full_name }}</li>
        </ol>
        <div v-if="userInfo">
          <hr>
          <h3>{{ userInfo.first_name }} {{ userInfo.last_name }}</h3>
          <div>Email: {{ userInfo.email }}</div>
          <img :src="userInfo.avatar" alt="avatar">
        </div>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          users: [],
          userInfo: null
        };
      },
      async fetch() {
        try {
          this.users = await this.$axios.$get("/api/users/index");
        } catch (e) {
          console.error(e);
          throw e;
        }
      },
      methods: {
        async getUserInfo(id) {
          try {
            this.userInfo = await this.$axios.$post("/api/users/show", {
              id: id
            });
          } catch (e) {
            console.error(e);
            throw e;
          }
        }
      }
    };
    </script>
    
    <style scoped>
    li {
      cursor: pointer;
    }
    .highlight {
      color: green;
      font-weight: bold;
    }
    </style>
    

    Users, HTTP 3gzhl.sse.codesandbox.io/api/users/show?id=4

    {"id":4,"email":"eve.holt@reqres.in","first_name":"Eve","last_name":"Holt","avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/128.jpg"}
    


  7. .. API, . API

    /plugins/api-context.js
    export default (context, inject) => {
        inject('api', async (controller, method, params) => {
            try {
                return await context.$axios['$' + (params ? 'post' : 'get')]('/api/' + controller + '/' + method, params);
            } catch (e) {
                console.error(e);
                throw e;
            }
        })
    }
    



    nuxt.config.js
    export default {
      ...
      plugins: ["~/plugins/api-context.js"]
    }
    

    ( ) :

    /pages/index.vue
    ...
    <script>
    export default {
      ...
      async fetch() {
        this.users = await this.$api("users", "index");
      },
      methods: {
        async getUserInfo(id) {
          this.userInfo = await this.$api("users", "show", {id: id});
        }
      }
    };
    </script>
    


1


рд╣рдореЗрдВ рдПрдХ рдкреВрд░реНрдг рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде Nuxt рдорд┐рд▓рд╛ ред

  • рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдирд┐рдпрдВрддреНрд░рдХ / рдПрдкреАрдЖрдИ / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИрдВ
  • рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ /serverMiddleware/api-server.js рдирд┐рд╣рд┐рдд рд╣реИ
  • рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рд░реНрд╡рд░ API рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдирдП рдорд┐рдбрд▓рд╡реЗрдпрд░ / ServerMiddleware / рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдЙрдиреНрд╣реЗрдВ nuxt.config.js рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

тЖТ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдБ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
тЖТ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдпрд╣рд╛рдБ

All Articles