Skip to content

完成任务 #11

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/config/default.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
'use strict';

module.exports = {
/**mongodb 的连接地址 */
mongodburl: 'mongodb://127.0.0.1:27017/app_test',
}
5 changes: 5 additions & 0 deletions app/config/development.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use strict';

module.exports = {

}
22 changes: 22 additions & 0 deletions app/db.js
Original file line number Diff line number Diff line change
@@ -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 } });
});
2 changes: 2 additions & 0 deletions app/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
require('babel-core/register');
require("./server");
8 changes: 8 additions & 0 deletions app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down
85 changes: 85 additions & 0 deletions app/routes/api.js
Original file line number Diff line number Diff line change
@@ -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

20 changes: 20 additions & 0 deletions app/routes/index.js
Original file line number Diff line number Diff line change
@@ -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)
}
21 changes: 20 additions & 1 deletion app/server.js
Original file line number Diff line number Diff line change
@@ -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");
});