node+mysql+express基础应用

介绍

1.express

  • 为不同 URL 路径中使用不同 HTTP 动词的请求(路由)编写处理程序。
  • 集成了“视图”渲染引擎,以便通过将数据插入模板来生成响应。
  • 设置常见 web 应用设置,比如用于连接的端口,以及渲染响应模板的位置。
  • 在请求处理管道的任何位置添加额外的请求处理“中间件”。

环境准备

1.安装node

2.安装mysql,配置环境变量

3.安装vsCode的mysql插件

初始化项目

1.创建项目

npm init -y 

2.安装依赖

npm i express mysql  

3.安装配置热更新

npm i hotnode -g // 安装

4.配置启动命令

"start": "hotnode index.js"   // package.json中配置启动命令

接口实现

简单接口实现

const express = require("express");
const app = express();

// 请求拦截 会匹配所有请求
app.all("*", (req, res, next) => {
  const login = Math.random();
  if (login > 0.5) return res.json("未登录");
  next();
});

// get请求
app.get("/", (req, res) => {
  res.send("Hello World");
});
app.get("/liyfn", (req, res) => {
  res.send("Hello liyfn");
});

// post
app.post("/post", (req, res) => {
    
  res.json({ name: "liyfn" });
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});

参数解析

// 安装body-parser
const bodyParser = require("body-parser");
app.use(bodyParser.json()); // json请求
app.use(bodyParser.urlencoded({ extended: false })); // 表单

// 使用 body:请求体 query:查询参数
app.post("/post", (req, res) => {
  console.log(req.query, req.params, req.body);
  res.json({ name: "liyfn" });
});

跨域

// 解决跨域
const cors = require("cors");
app.use(cors());

数据库连接

1.基础连接

// 创建连接对象
var connection = mysql.createConnection(options); 
// 连接
connection.connect(function(err) { *** }); 
// 关闭
connection.end(function(err) { *** }); 
connection.destroy();

2.连接池

// 连接mysql
const mysql = require("mysql");
const db = mysql.createPool({
  host: "localhost",
  user: "root",
  port: "3306",
  password: "123456",
  database: "demo",
});

db.query("select * from userinfo", (err, data) => {
  console.log(data);
});

3.区别

当连接不再需要时,这些连接可以缓存在连接池中,当接收到下一个客户端请求时,从连接池中取出连接并重新利用,而不需要再重新建立连接

项目应用

安装脚手架

yarn global add express express-generator

创建项目

 express --view=pug
        --version        打印版本号
    -e, --ejs            添加 ejs 引擎支持
        --pug            添加 pug 引擎支持
        --hbs            添加 handlebars 引擎支持
    -H, --hogan          添加 hogan.js 引擎支持
    -v, --view <engine>  添加 <engine> 视图引擎支持 (ejs|hbs|hjs|jade|pug|twig|vash) (默认为 jade)
    -c, --css <engine>   添加 <engine> 样式表引擎支持 (less|stylus|compass|sass) (默认为纯 css)
        --git            添加 .gitignore
    -f, --force          对非空文件夹强制执行
    -h, --help           打印帮助信息

配置打印日志

1.安装winston

yarn add winston

2.封装本地日志写入方法logger.js

const { createLogger, format, transports } = require("winston");
const fs = require("fs");
const path = require("path");

const env = process.env.NODE_ENV || "development";
const logDir = "log";

// Create the log directory if it does not exist
if (!fs.existsSync(logDir)) {
  fs.mkdirSync(logDir);
}

const filename = path.join(logDir, "results.log");

const logger = createLogger({
  // change level if in dev environment versus production
  level: env === "production" ? "info" : "debug",
  format: format.combine(
    format.label({ label: path.basename(process.mainModule.filename) }),
    format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" })
  ),
  transports: [
    new transports.Console({
      format: format.combine(
        format.colorize(),
        format.printf(
          (info) =>
            `${info.timestamp} ${info.level} [${info.label}]: ${info.message}`
        )
      ),
    }),
    new transports.File({
      filename,
      format: format.combine(
        format.printf(
          (info) =>
            `${info.timestamp} ${info.level} [${info.label}]: ${info.message}`
        )
      ),
    }),
  ],
});

module.exports = logger;

3.改写原错误处理方式

const logger = require("./logger");
const errorHandler = (err, req, res, next) => {
  logger.error(`${err.method} ${req.originalUrl}` + err.message);
  const errorMessage = err.message;
  res.status(err.status || 500).json({
    code: -1,
    success: false,
    message: errorMessage,
    data: null,
  });
};
app.use(errorHandler);

使用数据库

1.安装mysql插件 mysql 和 查询构建器knex

yarn add mysql knex

2.配置文件

module.exports = {
  mysql: {
    host: "127.0.0.1",
    port: 3306,
    user: "root",
    password: "123456",
    database: "demo",
  },
  log: {
    error(msg) {
      console.log("[knex error]", msg);
    },
  },
};

3.连接数据库 knex.js

const config = require("../config");
const knex = require("knex");
// 建立连接
module.exports = knex({
  client: "mysql",
  connection: {
    ...config.mysql,
  },
  log(msg) {
    console.log("[knex error]", msg);
  },
});

4.封装基础增删改查方法base.js

const knex = require("./knex");

// 增删改查
class Base {
  constructor(table) {
    this.table = table;
  }
  // 查
  get() {
    return knex(this.table).select();
  }
  //  增
  insert(params) {
    return knex(this.table).insert(params);
  }
  // 改
  update(id, params) {
    return knex(this.table).where("id", "=", id).update(params);
  }
  //   删除
  del(id) {
    return knex(this.table).where("id", "=", id).del();
  }
}
module.exports = Base;

5.封装表模型

const Base = require("./base");

class Author extends Base {
  constructor(props = "author") {
    super(props);
  }
}

module.exports = new Author();

6.数据查询

const Author = require("../models/author");

// 获取数据
const getAuthor = {
  showUser: async (req, res) => {
    try {
      let data = await Author.all();
      res.json({
        code: 200,
        message: "操作成功",
        data,
      });
    } catch (error) {
      res.json({
        code: 0,
        message: "获取失败",
      });
    }
  },
};

module.exports = getAuthor;

7.接口返回封装

var express = require("express");
var router = express.Router();

const authorController = require("../controllers/author");

/* GET users listing. */
router.get("/", authorController.showUser);

module.exports = router;

knex使用

https://knexjs.org/guide/

你可能感兴趣的:(mysql,express,数据库)