Vue3 + NodeJs(Koa) 项目搭建

1,772 阅读2分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

技术栈

  • 前端:Vue3 + Vite + ElementUI
  • 后端:使用 Koa 作为服务器框架
  • 数据库:使用MongoDB

前端部分

搭建

直接使用Vite 来快速构建 Vue 项目

npm init @vitejs/app vue3-node

然后选择Vue框架。 安装 elementUI 作为组件库

npm install element-plus --save

在main.js 中注册

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css'
const app = createApp(App);

app.use(ElementPlus);
app.mount('#app')

接入路由

在src目录下创建router文件夹,文件夹里面创建路由信息index.js

import { createRouter, createWebHashHistory} from 'vue-router'
import Home from '../views/home.vue'
const routes = [
  {
    path: '/',
    component: Home
  }
]

const router = createRouter({
  history: createWebHashHistory(),
  routes,
})
export default router;

main.js里进行注册

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import router from './router'
const app = createApp(App);

app.use(router)
app.use(ElementPlus);
app.mount('#app')

修改App.vue

<template>
  <router-view></router-view>
</template>

接入Axios

使用Axios 来作为http请求的库,为了方便使用,我们做一些封装,在src目录下创建api目录,目录下有个index.js 文件

// src/api/index.js
import axios from 'axios';
import { ElMessage } from 'element-plus'

const service = axios.create({
  baseURL: import.meta.env.VITE_BASE_API, // api 的 base_url
  timeout: 50000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  },
  transformRequest: [data => JSON.stringify(data)] // 参数转换
});

// axios实例拦截响应
service.interceptors.response.use(
  (response) => {
    if (response.status !== 200) {
      ElMessage.error('网络连接异常,请稍后再试!');
    }
    return response;
  },
  // 请求失败
  (error) => {
    ElMessage.error(error.message);
  }
);

// axios实例拦截请求
service.interceptors.request.use(
  (config) => {
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
) 

export default service;

我们上面使用了import.meta.env.VITE_BASE_API 来获取环境变量VITE_BASE_API,所以需要在根目录创建.env文件,进行设置环境变量

VITE_BASE_API=http://localhost:3000

然后在api目录下在创建一个api文件,这个文件的作用是用来保存请求接口的方法,后续使用时,在这个文件新增接口请求的方法,然后在具体页面调用,这样的好处是,多个地方调用同一个接口时方便使用和修改。比如我们现在需要请求一个接口 /api/hello

// src/api/api.js
import request  from './index';

export function getData(params) {
  return request({
    url: '/api/data',
    method: 'get',
    params
  });
}

需要使用的话,我们在使用的页面进行引入

import { getData } from '@/api/api'

getData().then(res=> {
 console.log(res);
}).catch(err=>{
 console.log(err);
})

到这里我们就搭建完成一个简单的前端项目。

后端部分

执行npm init 初始化项目后,在根目录下创建app.js。安装Koa

npm install koa --save
const Koa = require('koa');
const app = new Koa();

app.use(async (ctx) => {
  ctx.body = 'Hello World';
});

app.listen(3001);

在终端执行nodemon app.js就可以启动项目了,这是在浏览器 打开http://localhost:3001/ 就会出现 Hello World

添加路由

创建文件 routers/index.js

const Router = require('koa-router');

const router = new Router();
router.prefix('/api');

router.get('/data', async (ctx, next) => {
  const { name } = ctx.query;
  ctx.type = 'json';
  ctx.body = {
    code: 200,
    message: '请求成功',
    data: `hello ${name || ''}`,
  };
  return next();
});
module.exports = router;

在 app.js 中注册

const Koa = require('koa');
const Router = require('./routers/index');

const app = new Koa();

app.use(async (ctx) => {
  ctx.body = 'Hello World';
});
app.use(Router.routes(), Router.allowedMethods());
app.listen(3001);

这时候我们在前端项目中请求 http://localhost:3001/api/data 会报跨域的错,所以我们还需要对跨域进行处理。
安装中间件 koa2-cors

npm install koa2-cors --save

在 app.js 中注册

const Koa = require('koa');
const cors = require('koa2-cors');
const Router = require('./routers/index');

const app = new Koa();

app.use(cors());

app.use(Router.routes(), Router.allowedMethods());
app.listen(3001);

这是我们在前端项目请求 http://localhost:3001/api/data 就会返回正确的数据了

接入 MongoDB

首先电脑需要有个MongoDB数据库,安装MongoDB 直接去官网下载即可,下载地址:www.mongodb.com/download-ce…

安装mongodb 和 mongoose。mongoose为模型提供了一种直接的,基于scheme结构去定义你的数据模型。它内置数据验证, 查询构建,业务逻辑钩子等,开箱即用。

npm i mongodb mongoose -S

使用mongoose连接MongoDB数据库。如果你的数据库没有设置账号密码,那么可以直接使用mongoose.connect('mongodb://host:port/database'),如果设置了密码,则使用mongoose.connect('mongodb://username:password@host:port/database'); 在项目中创建 /models/index.js

const mongoose = require('mongoose');

mongoose.Promise = Promise;
const url = 'mongodb://0.0.0.0:27017/test';
mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true });
const db = mongoose.connection;
db.on('error', (error) => {
  console.log(`数据库连接失败:${error}`);
});

db.on('open', () => {
  console.log('数据库连接成功');
});

这样就可以连接成功了,后续就可以直接使用 mongoose 进行操作,