后端

async/await

概念

  1. 现在最常用的异步编程方案
  2. async 函数是 Generator 函数的语法糖
  3. 具备特点
    ① 内置执行器:Generator 函数的执行必须依靠执行器,而 async 函数自带执行器,调用方式跟普通函数的调用一样
    ② 更好的语义:async 和 await 相较于 * 和 yield 更加语义化
    ③ 更广的适用性:co 模块约定,yield 命令后面只能是 Thunk 函数或 Promise对,而 async 函数的 await 命令后面则可以是 Promise 或者 原始类型的值(Number,string,boolean,但这时等同于同步操作)
    ④ 返回值是 Promise:async 函数返回值是 Promise 对象,比 Generator 函数返回的 Iterator 对象方便,可以直接使用 then() 方法进行调用

使用

  1. async 是“异步”的简写, async function 用于申明一个 function 是异步的; await,可以认为是async wait的简写,用于等待一个异步方法执行完成;
  2. async/await是一个用同步思维解决异步问题的方案(等结果出来之后,代码才会继续往下执行)
  3. 可以通过多层 async function 的同步写法代替传统的callback嵌套

在项目中如果要使用async/await,需要安装和配置transform-runtime

步骤

npm i babel-plugin-transform-runtime -D

配置.babelrc

"plugins": [
   "transform-runtime"
]

实战Node—幼教平台项目重构和优化_端口号

不安装则会报错

编译代码时报 regeneratorRuntime is not defined 错误

MVC模式设计

  1. 在Controller文件夹中新建SowingController.js
    实战Node—幼教平台项目重构和优化_业务逻辑_02
  2. 将sowing.js中业务逻辑抽到SowingController.js中
    在SowingController.js中新建函数insertOneSowing()并将插入一条新纪录业务逻辑从sowing.js中转移到该函数中,通过async声明该函数是异步函数。 实战Node—幼教平台项目重构和优化_业务逻辑_03
  3. async/await的方式替换callback()
    替换后的数据库操作
    实战Node—幼教平台项目重构和优化_业务逻辑_04
  4. sowing.js中引入SowingController.js
    实战Node—幼教平台项目重构和优化_连接数据库_05
  5. 修改之前的路由
    实战Node—幼教平台项目重构和优化_业务逻辑_06

端口号配置

各个环境下,nodejs可以通过process.env.PORT去设置端口号

比如

  1. linux环境下
    PORT=1234 node app.js
    使用上面命令每次都需要重新设置,如果想设置一次永久生效,使用下面的命令
    export PORT=1234
    node app.js

  2. windows环境下
    set PORT=1234
    node app.js
    package.json配置文件

    "scripts": {
       "start": "set PORT=8888 && node ./bin/www"
     },
    

实操

  1. config.js

    port: parseInt(process.env.PORT, 10) || 3000,
    
  2. app.js

    app.listen(config.port, () => {
       console.log(`server is running, port:${config.port}`)
    });
    

中间件session抽取

config.js

实操

secret: 'itlike.com',
name: 'likeid',
maxAge:  365 * 24 * 60 * 60 * 1000,
db_url:'mongodb://localhost:27017/school'

实战Node—幼教平台项目重构和优化_C_07

集成插件chalk

  1. 简介:chalk是一个颜色的插件。可以通过 比如: chalk.blue(‘hello world’)之类的方法来改变颜色
  2. 使用
    下载:$ npm install chalk
    引入:import chalk form 'chalk'
    显示:console.log(chalk.blue('Hello world!'));

封装数据库连接

  1. 简介:全局连接数据库

  2. 实操代码
    首先新建db.js,并在app.js中导入db.js,使每一次访问时首先连接数据库

    实战Node—幼教平台项目重构和优化_业务逻辑_08
    实战Node—幼教平台项目重构和优化_C_09

    'use strict';
    import mongoose from 'mongoose';
    import config from './../src/config';
    mongoose.connect(config.db_url, {useNewUrlParser: true});
    mongoose.Promise = global.Promise;
    const db = mongoose.connection;
    
    db.once('open' ,()=>{
    console.log('连接数据库成功');
    });
    
    db.on('error', (error)=>{
       console.error('连接数据库时发生错误: ' + error);
       mongoose.disconnect();
    });
    
    db.on('close', function() {
       console.log('数据库断开,重新连接数据库');
       mongoose.connect(config.db_url, {server:{auto_reconnect:true}});
    });
    
    export default db;
    

实战Node—幼教平台项目重构和优化_业务逻辑_10

前端

全局配置服务器地址

新建config.js,并在其中利用闭包进行配置
实战Node—幼教平台项目重构和优化_业务逻辑_11
实战Node—幼教平台项目重构和优化_C_12

(function (window) {
    window.LK = {};
    LK.SERVER = 'http://localhost:3000/'
})(window);