上次我们使用nodejs+express+lowdb制作了简单地记账本功能,此次加入数据库,学习从数据库中调取数据。使用mongoose进行数据库调用。
一、连接mongoose服务
(1)创建db文件夹,用于导入和连接mongoose服务,使用前先安装mongoose
安装 npm i mongoose
db.js代码如下
module.exports = function(success, error) {
//判断
if (typeof error !== 'function') {
error = () => {
console.log('连接失败');
}
}
//安装mongoos
//导入mongoos
const mongoose = require('mongoose');
//连接mongoos服务
const {DBHOST,DBPORT,DBNAME}=require('../config/config.js')
mongoose.connect(`mongodb://${DBHOST}:${DBPORT}/${DBNAME}`);
//设置回调
mongoose.connection.once('open', () => {
success()
})
mongoose.connection.on('error', () => {
error()
})
mongoose.connection.on('close', () => {
console.log('连接关闭');
})
}
(2)创建config文件夹,用于存储连接mongoose服务的地址,便于后期修改
config.js代码如下
module.exports={
DBHOST:'127.0.0.1',
DBPORT:27017,
DBNAME:'test'
}
(3)创建models文件夹,用于存储文档模型
accountModels.js代码如下
const mongoose = require('mongoose');
let accountSchema = new mongoose.Schema({
title: {
type: String,
required: true,
},
time: Date,
type:{
type: Number,
default:-1
},
money:Number,
remark:String
});
let accountModel = mongoose.model('account', accountSchema);
module.exports = accountModel
(3)在bin文件夹www下导入db
代码如下
#!/usr/bin/env node
//导入db
const db=require('../db/db')
db(()=>{
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('account:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
})
二、路由规则修改
在routers文件夹下的index.js修改增加与删除功能代码
代码中加入了moment进行日期数据的处理
安装方法:npm i moment
var express = require('express');
var router = express.Router();
const moment =require('moment');
const accountModel = require('../models/accountModels');
// const low=require('lowdb')//导入lowdb
// const FileSync=require('lowdb/adapters/FileSync')
// const adapter=new FileSync(__dirname+'/../data/db.json')
// const db=low(adapter)
// const shortid=require('shortid')
/* GET home page. */
console.log(moment(new Date()).format('YYYY-MM-DD'));
//记账本页面(当浏览器访问account时会在views文件下寻找account.ejs文件并渲染页面)
router.post('/account', function(req, res, next) {
// console.log(req.body);
//插入数据库
accountModel.create({...req.body,time:moment(req.body.time).toDate()}).then((data,err)=>{
if(err){
res.status(500).send('插入失败')
return
}
let account=accountModel.find().sort({time:-1}).then((data1,err)=>{
console.log(data1);
res.render('account', { account:data1 ,moment:moment});
});
})
});
//添加记录
router.get('/create', function(req, res, next) {
res.render('create', { title: 'Express' });
});
//删除记录
router.get('/account/:id',(req, res, next)=>{
//获取id参数
let id=req.params.id
accountModel.deleteOne({_id:id}).then((data,err)=>{
console.log(data);
let account=accountModel.find().sort({time:-1}).then((data1,err)=>{
res.render('account', { account:data1,moment:moment} );
})
});
})
module.exports = router;