From bf1106337d14e6272190fd392207d9726e37bd13 Mon Sep 17 00:00:00 2001 From: mytwz Date: Fri, 28 Feb 2020 15:50:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/config/default.js | 6 +++ app/config/development.js | 5 +++ app/db.js | 22 ++++++++++ app/index.js | 2 + app/package.json | 8 ++++ app/routes/api.js | 85 +++++++++++++++++++++++++++++++++++++++ app/routes/index.js | 20 +++++++++ app/server.js | 21 +++++++++- 8 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 app/config/default.js create mode 100644 app/config/development.js create mode 100644 app/db.js create mode 100644 app/index.js create mode 100644 app/routes/api.js create mode 100644 app/routes/index.js diff --git a/app/config/default.js b/app/config/default.js new file mode 100644 index 0000000..dff629d --- /dev/null +++ b/app/config/default.js @@ -0,0 +1,6 @@ +'use strict'; + +module.exports = { + /**mongodb 的连接地址 */ + mongodburl: 'mongodb://127.0.0.1:27017/app_test', +} \ No newline at end of file diff --git a/app/config/development.js b/app/config/development.js new file mode 100644 index 0000000..6874422 --- /dev/null +++ b/app/config/development.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + +} \ No newline at end of file diff --git a/app/db.js b/app/db.js new file mode 100644 index 0000000..79b318a --- /dev/null +++ b/app/db.js @@ -0,0 +1,22 @@ +'use strict'; + +const mongoose = require('mongoose'); +const config = require('config-lite'); +const db = mongoose.connection; + +mongoose.connect(config.mongodburl, { useNewUrlParser: true }); +mongoose.Promise = global.Promise; + +db.once('open', () => { + console.log("数据库连接成功") +}) + +db.on('error', function (error) { + console.error("数据库异常关闭"); + mongoose.disconnect(); +}); + +db.on('close', function () { + console.log("断开重连") + mongoose.connect(config.mongodburl, { server: { auto_reconnect: true } }); +}); diff --git a/app/index.js b/app/index.js new file mode 100644 index 0000000..910d7f0 --- /dev/null +++ b/app/index.js @@ -0,0 +1,2 @@ +require('babel-core/register'); +require("./server"); \ No newline at end of file diff --git a/app/package.json b/app/package.json index 6b480b3..b8026ff 100755 --- a/app/package.json +++ b/app/package.json @@ -10,7 +10,15 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { + "babel": "^6.23.0", + "babel-cli": "^6.24.1", + "babel-core": "^6.24.0", + "babel-preset-es2015": "^6.24.0", + "babel-preset-stage-3": "^6.22.0", + "babel-register": "^6.24.0", "express": "^4.17.1", + "config-lite": "^1.5.0", + "body-parser-xml": "^1.1.0", "mongoose": "^5.9.2" }, "devDependencies": { diff --git a/app/routes/api.js b/app/routes/api.js new file mode 100644 index 0000000..3f17a81 --- /dev/null +++ b/app/routes/api.js @@ -0,0 +1,85 @@ +'use strict' + +const express = require('express'); +const api = express.Router() +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; +// 设置数据库对象结构 +const UserDB = mongoose.model("user", new Schema({ + username:{type:String, default:""}, + /**创建时间 */ + create_time: { type: String, default: "" }, + /**其他备用数据 */ + other_item: Object, + enabled: { type: Boolean, default: true }, +})) + +// 获取单表列表 +const getSchemaList = async (query, pageNo = 1, pageSize = 10, sort = "create_time") => { + let temp = query.model + let tempQuery = query.getQuery() + let count = await query.count() || 0; + let list = (+pageSize != -1 ? await temp.find(tempQuery).skip((+pageNo - 1) * +pageSize).limit(+pageSize).sort({[sort]:-1}).lean() : await temp.find(tempQuery).sort({[sort]:-1}).lean()) || [] + let total = ~~(count / pageSize) || 1 + + if (1 < total % pageSize ){ + total = total + 1; + } + return { + count, total, pageNo, nextPage:pageNo >= total ? total : pageNo + 1, pageSize, list + } +} + +// 向客户端发送JSON数据 +const sendResponseBody = (res, message = "OK", code = 100, data = {}, state = 200) => { + res.status(state).send({ + code, message, data + }); +} + +// 增 +api.post("/user", async (req, res, next) => { + let {username = ""} = req.body; + if(username == ""){ + sendResponseBody(res, "用户名不能为空", -1); + return ; + } + await UserDB.create({ username, create_time:new Date().toLocaleString() }) + sendResponseBody(res); +}) +// 删 +api.delete("/user", async (req, res, next) => { + let {id} = req.body; + let user = await UserDB.findById(id).lean(); + if(user){ + await UserDB.findByIdAndRemove(id); + sendResponseBody(res, "删除成功"); + return; + } + sendResponseBody(res, "找不到用户", -2); +}) +// 改 +api.put("/user", async (req, res, next) => { + let {id = "", username = ""} = req.body; + if(username == ""){ + sendResponseBody(res, "用户名不能空!", -1); + return; + } + // 获取 userdb 纯数据对象 + let user = await UserDB.findById(id).lean(); + if(user){ + await UserDB.findByIdAndUpdate(id, { username }); + sendResponseBody(res, "修改成功"); + return ; + } + sendResponseBody(res, "找不到用户", -2) +}) +// 查 +api.get("/user", async (req, res, next) => { + let {pageNo = 1, pageSize = 10} = req.query; + let userList = await getSchemaList(UserDB.find(), pageNo, pageSize); + sendResponseBody(res, 100, "OK", userList); +}) + +module.exports = api + diff --git a/app/routes/index.js b/app/routes/index.js new file mode 100644 index 0000000..9be920b --- /dev/null +++ b/app/routes/index.js @@ -0,0 +1,20 @@ +'use strict'; + +const bodyParser = require('body-parser'); +const api = require("./api"); + +module.exports = app => { + // 设置 JSON 解析 + app.use(bodyParser.json()); + // 设置 URL 解析 + app.use(bodyParser.urlencoded({ extended: true })); + // 设置全局异常捕获 + app.use(function(err, req, res, next){ + console.error(err.stack); + res.status(500).send({ + message:"System Error" + }); + }) + // 设置路由 + app.use("/api", api) +} diff --git a/app/server.js b/app/server.js index 72e5b39..5e486fe 100755 --- a/app/server.js +++ b/app/server.js @@ -1,11 +1,30 @@ const express = require('express'); - +const router = require("./routes/index"); const app = express(); +// 设置跨域访问 +app.all('*', (req, res, next) => { + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With, token"); + res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); + res.header("Access-Control-Allow-Credentials", true); //可以带cookies + res.header("X-Powered-By", 'Express'); + if (req.method == 'OPTIONS') { + res.sendStatus(200); + } else { + next(); + } +}); + app.get('/', (req, res) => { res.json({"message": "Building a RESTful CRUD API with Node.js, Express/Koa and MongoDB."}); }); +// 连接数据库 +require("./db"); +// 设置路由 +router(app); +// 启动服务 app.listen(3000, () => { console.log("Server is listening on port 3000"); }); \ No newline at end of file