express从零开始架构个人博客服务端项目

很多时候写express项目大都是用生成器自动生成的项目结构,基本用法就是在router文件夹中写接口,在app.js中进行使用。router文件中的一个js文件既要进行数据库操作,又要写业务逻辑,这样的写法容易导致后期代码都堆积在一起了,不好维护,可读性也很差,并且有很多重复代码。小编就已经踩过此坑了,现在决定尝试采用数据库操作,业务逻辑,路由分开的方式重新自己从头写一下个人博客的接口项目结构。

写好一个项目,首先要有一个好的开始(架构)。

构建项目结构

首先创建一个server文件夹,然后初始化这个项目,并安装express,命令依次是npm init、npm install express -g。然后就是创建项目文件结构,如下:

api文件夹:用来存放接口,middleware文件夹中用来放获取到数据后,将结果发送给前端之前的业务逻辑代码。router里面用来放各个路由文件,index.js文件用来将router文件夹中的路由整合在一起。

config文件夹中放的配置文件,大都是些配置信息,常量。

loader文件夹中用来存放加载页面时的那些东西,最终会在app.js中被使用,相当于是对app.js中的内容进行了一个分解。index.js是所有要加载东西的集合体,也是最终在app.js中被引用的文件。

models文件夹里面放的是数据库操作,db.js是连接数据库,并暴露一个方法进行数据库操作。base.js里面封装了几个基本的数据库操作,新增、查询等,统一了操作成功和失败的返回结果。essay.js就是具体某个功能写接口时涉及到的数据库操作啦。

utils文件中放封装的功能性方法,这里我写了一个将时间转换成YYYY-MM-DD  HH:MM:SS格式的方法。

views文件夹里面就用来放页面,到时候可以将vue项目打包以后的结果直接放在这里面。这里简单建立了两个页面先占个坑位,前台页面web中的index.html,后台管理页面manage中的index.html。具体指向还需要在加载的时候设置一下。

目前还只是个简单的项目结构,我先把基本的代码贴在下面。等整个项目做完了,我在放到github上去。

api中的essay.js

const getDate = require("../../utils/formateDate");
//格式化数据
const getList = data => {
  return data.map(d => {
    return { content: d.content, createTime: getDate(d.createTime) };
  });
};
exports.getList = getList;

api->router中的essay.js

//随笔
const express = require("express");
const router = express.Router();

const essayModel = require("../../models/essay");
const essayWare=require("../middleware/essay");

module.exports = route => {
  route.use("/essay", router);

  router.get("/getList", async (req, res, next) => {
    const data = await essayModel.search(req);
    data.data=essayWare.getList(data.data);
    res.send(data);
  });
  router.post("/add", async (req, res, next) => {
    const data = await essayModel.add(req);
    res.send(data);
  });
  router.get("/getCount", async (req, res, next) => {
    const data=await essayModel.count(req);
    res.send(data);
  });
};

api中的index.js

const Router=require('express').Router();
const essayRouter=require('./router/essay');

module.exports= () => {
	essayRouter(Router);
	return Router;
}

config中的index.js

module.exports = {
  port: 3000,
  database: {
    host: "数据库的IP",
    port: '数据库的端口号,
    user: "数据库的用户名",
    password: "数据库的密码",
    database: "数据库的名称"
  }
};

loader中的express.js

//主要的页面内容
const createError = require("http-errors");
const express = require("express");
const app = express();
const path = require("path");
const cookieParser = require("cookie-parser");
const logger = require("morgan");
const cors = require("cors");
const ejs = require("ejs");
const router = require("../api");

module.exports = app => {
  //路由
  app.use("/api", router());
  // 跨域处理
  app.use(
    cors({
      origin: ["http://localhost:8080"],
      methods: ["GET", "POST"],
      allowedHeaders: ["Content-Type", "Authorization"]
    })
  );
  //中间件
  app.use(logger("dev"));
  app.use(express.json());
  app.use(express.urlencoded({ extended: false }));
  app.use(cookieParser());
  //模板引擎
  // app.set("views", path.join(__dirname, "../views/web"));
  // app.engine(".html", ejs.__express);
  // app.set("view engine", ".html");
  //静态地址
  app.use("/", express.static(path.join(__dirname, "../views/web"))); //web端
  app.use("/manage", express.static(path.join(__dirname, "../views/manage"))); //后台管理
  // 404,没有路由匹配的情况
  app.use(function(req, res, next) {
    next(createError(404));
  });
  // 错误处理
  app.use(function(err, req, res, next) {
    res.locals.message = err.message;
    res.locals.error = req.app.get("env") === "development" ? err : {};
    res.status(err.status || 500);
    // res.render("error");//渲染错误页面,根据默认的模板引擎目录有关,里面的文件
    res.send("出错了啊");
  });
};

loader中的index.js

//所有加载需要组合在一起的都放在这里,loader文件夹中的集合
const expressLoader=require('./express');

module.exports= (expressApp)=>{
    expressLoader(expressApp);
}

models中的db.js

/**
 * 连接数据库,并进行数据库操作
 */
const mysql = require('mysql');
const config=require('../config');

const connection = mysql.createConnection(config.database);

connection.connect(err => {
    if (err) console.log('连接失败');
    else console.log('连接成功')
});
// exports.connection = connection;

//新的数据库操作方法
const query=(sql,values)=>{
    return new Promise((resolve,reject)=>{
        connection.query(sql,values,(err,rows)=>{
            if(err){
                // reject(err);
                reject('err');
            }else{
                resolve(rows);
            }
        });
    });
}
exports.query=query;

models中的base.js

/**
 * 基本的数据库操作
 * addData 新增
 * searchData 查询数据
 * getCount 获取总数
 * 删除(伪)
 */
const db = require("./db");

const addData = async (sql,values) => {
    const data=await db.query(sql, values);
    if(data instanceof Object){
        return Promise.resolve({code:200,msg:'操作成功'});
    }else{
        return Promise.resolve({msg:'出错啦'});
    }
};
exports.addData=addData;

const searchData=async (sql,values)=>{
    const data=await db.query(sql,values);
    if(data instanceof Array){
        return Promise.resolve({code:200,data:data});
    }else{
        return Promise.resolve({msg:"出错了"});
    }
};
exports.searchData=searchData;

const getCount=async (sql,values)=>{
    const data=await db.query(sql,values);
    if(data instanceof Array){
        return Promise.resolve({code:200,count:data[0]['count(*)']});
    }else{
        return Promise.resolve({msg:"出错了"});
    }
}
exports.getCount=getCount;

models中的essay.js

const base=require('./base');

exports.add=async (request)=>{
    const params=request.query;
    const content = params.content;
    const createTime = new Date().getTime();
    const sql = "insert into essay(content,createTime) values(?,?)";
    const data=await base.addData(sql, [content, createTime]);
    return Promise.resolve(data);
}

exports.search=async (request)=>{
    const sql = "select * from essay";
    const data=await base.searchData(sql);
    return Promise.resolve(data);
}

exports.count=async (request)=>{
    const sql = "select count(*) from essay";
    const data=await base.getCount(sql);
    return Promise.resolve(data);
}

app.js的内容

const express = require("express");
const config = require("./config");

function startServer() {
  const app = express();
  const loaders = require("./loader");
  loaders(app);

  app.listen(config.port, err => {
    if (err) {
      console.log("出错了啊");
      process.exit(1);
      return;
    }
    console.log("我在监听3000端口");
  });
}

startServer();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值