vue+express+mongoose项目构建

注(2018-2-12):仅做纪录运用,又不舍得删除,引荐运用koa2,koa2相干材料许多的~

1. 运转环境构建(基于macOS Sierra 10.12.4)

  • 全局装置node(v6.9.4)

    装置历程略
  • 设置cnpm(npm的淘宝镜象)

    sudo npm install -g cnpm --registry=https://registry.npm.taobao.org`
  • 全局装置vue官方脚手架东西vue-cli(vue官网文档

    cnpm install --global vue-cli

2. 建立项目

  • 基于 webpack 模板建立

    vue init webpack tifi-music

    建立设置按需,我除了装置router以外其他都选了no

  • 运转与打包测试

    cd tifi-misic
    //装置依靠包
    cnpm i
    //运转
    npm run dev
    //打包
    npm run build

3. 设置express

  • 在项目根目次下建立server.js文件,内容以下

    //用于猎取途径
    const path = require('path')
    //用于读写文件流
    const fs = require('fs')
    const express = require('express')
    //无需cnpm装置,由于是express的中间件bodyParser
    //用于剖析客户端要求的body中的内容,内部运用JSON编码处置惩罚,url编码处置惩罚以及关于文件的上传处置惩罚.
    //bodyParse能够吸收客户端ajax提交的json数据,以及url的处置惩罚,不运用这个中间件将致使没法吸收客户端的json数据
    const bodyParser = require('body-parser')
    //须要cnpm装置,cookieParser中间件用于猎取web浏览器发送的cookie中的内容.
    //在运用了cookieParser中间件后,代表客户端要求的htto.IncomingMessage对象就具有了一个cookies属性
    //该属性之为一个对象的数组,个中存放了一切web浏览器发送的cookie,每一个cookie为cookies属性值数组中的一个对象.
    const cookieParser = require('cookie-parser')
    //serve-favicon中间件用于要求网站的icon用法以下
    //express().use(favicon(__dirname + '/public/images/favicon.ico'))
    const favicon = require('serve-favicon')
    //morgan中间件是日记中间件,用于node的日记输出
    //进阶用法见http://www.cnblogs.com/chyingp/p/node-learning-guide-express-morgan.html
    const logger = require('morgan')
    //猎取后端路由.我设置在根目次下的server文件,读取下面的index.js
    const routes = require('./server/router')
    //用于治理设置的插件.统一治理后端效劳端口和数据库衔接地点等,默许设置在config目次下的default.js中
    const config = require('config-lite')
    //compression 中间件用于紧缩和处置惩罚静态内容
    //例子:app.use(express.static(path.join(__dirname, 'public')))
    const compression = require('compression')
    //实例化express对象,用于衔接中间件
    const app = express()
    
    
    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(cookieParser());
    
    app.use(compression({ threshold: 0 }))
    app.use('/api', routes)
    
    
    app.use(express.static(path.resolve(__dirname, './dist')))
    // 由于是单页运用 一切要求都走/dist/index.html
    app.get('*', function(req, res) {
        const html = fs.readFileSync(path.resolve(__dirname, './dist/index.html'), 'utf-8')
        res.send(html)
    })
    app.listen(config.port, function () {
        console.log(`Server running in port ${config.port}`)
    })
    
  • 处理npm run dev时即开辟形式下跨域题目
    翻开根目次下的config目次下的index文件,设置proxyTable以下:

    proxyTable: {
        '/api': {
            //这里的target填效劳端的端口的接口地点
            target: 'http://localhost:3000/api/',
            changeOrigin: true,
            pathRewrite: {
                '/api': ''
            }
        }
    }
  • 建立router
    server.js文件中写了const routes = require(‘./server/router’)
    这里require的途径就是我们须要建立router的途径
    在根目次下建立server文件夹,并在其目次下建立router.js文件,内容以下:

    //express的路由中间件,引入守候从controller中增加路由
    const router = require('express').Router()
    //引入node的文件途径模块path和文件处置惩罚模块fs
    const path = require('path')
    const fs = require('fs')
    //读取controller文件下的一切控制器,为了完成动态读取控制器,有空再研讨更好的写法
    const controllers = fs.readdirSync(path.resolve(__dirname, './controller'))
    //遍历猎取到的文件,动态增加express的路由信息:url、type、response即要求途径、要求体式格局、相应处置惩罚函数
    controllers.forEach((file) => {
        //猎取到详细到控制器
      let controller = require('./controller/' + file)
        //遍历控制器照顾的信息
      for (let o in controller) {
            //猎取要求途径,未取到则取默许途径 为'/'+文件名(不包括后缀)
        let url = controller[o].url ? controller[o].url : ('/' + o)
            //猎取要求体式格局,未取到则取默许体式格局 为'get'
        let type = controller[o].type ? controller[o].type : 'get'
            //相应处置惩罚函数,未取到则运用默许的处置惩罚
        let response = controller[o].response ? controller[o].response : (req, res) => {
          res.json({
            success: false,
            info: '没有处置惩罚相应的无效路由'
          })
        }
            //设置路由信息
        router[type](url, response)
      }
    })
    //运用动态设置好的路由
    router.use(router)
    //输出路由
    module.exports = router
    
  • 建立controller
    router.js文件中写了猎取同级目次controller下的一切文件
    所以我们只须要在server文件夹下的controller中建立一个user的控制器
    即建立user.js文件,内容以下:

    const userName = [{
        name: '测试用户名0'
      },
      {
        name: '测试用户名1'
      }
    ]
    //'输出待增加的路由信息对象
    //每一个对象中可设置三个属性:url、type、response(不设置的话均做了默许处置惩罚)
    module.exports = {
      users: {
        response: (req, res) => {
          res.json(userName)
        }
      },
      reg: {
        type: 'post',
        response: (req, res) => {
          res.json('reg')
        }
      }
    }
  • 运转express

    • 前面文件建立完成以后,要运转express起首装置依靠包

      cnpm i cookie-parser morgan serve-favicon morgan config-lite –save-dev
    • 别的修正文件时须要频仍的重启效劳器,全局装置nodemon能够完成自动重启

      cnpm install -g nodemon 
    • 然后设置package.json中的scripts增加start敕令

      "scripts": {
          "dev": "node build/dev-server.js",
          "build": "node build/build.js",
          "start": "nodemon server.js"
      }
    • 实行npm run build打包项目用于临盆环境
    • 末了敕令行里输入node start就能够运转了,敕令行输出Server running in port 3000示意express胜利启动了,浏览器接见http://localhost:3000/api/users看到输出的测试数据就是胜利设置好express了

设置mongoose

  • 装置mongodb并启动(历程省略)
  • 装置mongoose

    cnpm install mongoose --save-dev
  • 衔接mongodb

    • 编写进口:在server文件下新建一个文件夹名为db,并在其下新建一个文件db.js,内容以下:

      //引入node的文件途径模块path和文件处置惩罚模块fs
      const path = require('path')
      const fs = require('fs')
      const mongoose = require('mongoose')
      
      
      // mongodb 衔接?
      mongoose.connect('mongodb://localhost/tifi-music')
      // 此处防备 node.js - Mongoose: mpromise 毛病
      mongoose.Promise = global.Promise;
      let db = mongoose.connection;
      db.on('error', console.error.bind(console, 'Connect error'))
      db.once('open', function() {
          console.log('Mongodb started successfully')
      })
      //声明待增加的model对象
      let model = {}
      //读取体式格局和router一样
      const schemas = fs.readdirSync(path.resolve(__dirname, './model'))
      schemas.forEach((file) => {
          //设置数据库表名为读取到的文件名(去除后缀名)
          let name = file.substring(0,file.lastIndexOf("."))
          //猎取到的对象就是数据库字段
          let schema = require('./model/' + file)
          //运用mongoose.Schema和mongoose.model完成对数据库表和字段的建立
          model[name] = mongoose.model(name, mongoose.Schema(schema))
      })
      //输出model对象
      module.exports = model
    • 编写model:也在db文件夹下新建一个文件夹名为model,并在其下新建user.js,内容以下:

      module.exports = {
        //设想数据库字段,先简朴的设置一些经常使用的字段
        name: String,
        phone: String,
        email: String,
        password: String,
        createTime: Date
      }
      
    • 修正controller:修正controller文件下单user.js为:

      //'引入mongoose的model
      const model = require('../db/db')
      //加密用户的暗码
      const sha1 = require('sha1')
      //mogodb会自动的为我们增加_id字段,范例为objectid,我们要把它转换成建立该用户的时候
      const objectIdToTimestamp = require('objectid-to-timestamp')
      
      
      module.exports = {
        //猎取一切用户
        users: {
          response: (req, res) => {
            model.User.find({}, (err, doc) => {
              if (err) console.log(err)
              res.send(doc)
            })
          }
        },
        //用户注册
        reg: {
          type: 'post',
          response: (req, res) => {
            console.log(req.body);
            let userRegister = new model.User({
              email: req.body.email,
              password: sha1(req.body.password),
            })
            // 将 objectid转换为用户建立时候,运用是的UTC国际标准时候
            userRegister.createTime = objectIdToTimestamp(userRegister._id)
      
            //查询邮箱是不是已存在于数据库
            model.User.findOne({
              email: (userRegister.email)
                .toLowerCase()
            }, (err, doc) => {
              if (err) console.log(err)
              if (doc) {
                res.json({
                  success: false,
                  info: '该邮箱已被注册'
                })
              } else {
                userRegister.save(err => {
                  if (err) console.log(err)
                  console.log(new Date(), 'register success')
                  res.json({
                    success: true,
                    data: {
                      email: userRegister.email
                    }
                  })
                })
              }
            })
          }
        }
      }
      
  • 运转mongoose与测试查询与插进去

    • 肯定衔接mongod胜利,假如之前设置好nodemon的话,控制台会有Mongodb started successfully
    • 测试插进去数据,翻开postman举行post要求,胜利以后以下图:
![图片形貌][3]
- 测试查询数据,翻开[postman][2]举行get要求,胜利以后以下图:
![图片形貌][5]
- 假如前面都胜利了,申明已胜利的衔接了mongoose,申明悉数的基础建设已搞好了,能够举行下一步的开辟了!

    原文作者:xiecp
    原文地址: https://segmentfault.com/a/1190000009010750
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞