记账本(node.js)
1. 功能实现
在web端实现一个记账本,有查看添加和删除账单记录功能,包括事件、时间、金额、备注等。
2. 技术要点与细节
app.js终端:npm start
routes/index.js:路由
views:HTML页面与ejs文件
npm包管理:npm i 包,npm uninstall 包
2.1 http服务
2.1.1 HTTP基本概念
HTTP(超文本传输协议)是一种基于TCP/IP的应用层通信协议,协议中主要包括了客户端和服务端两个方面的内容。
2.1.2 请求报文
请求行、请求头、空行、请求体
2.1.3 响应报文
响应行、响应头、空行、响应体
2.1.4 创建HTTP服务
//1. 导入http模块
const http = require('http');
//2. 创建服务对象create创建server服务
//request是对请求报文的封装对象,response是对响应报文的封装对象
const server = http.createServer((request,response)=>{
response.end('Hello HTTP server');
});
//3. 监听端口
server.listen(9000,()=>{
console.log('服务已经启动,端口9000监听中')
})
2.2 express框架、路由
2.2.1 express基本概念
是一个封装好的工具包,可以通过npm i express来安装。
2.2.2 express路由
路由确定了应用程序如何响应客户端对特定端点的请求。一个路由由请求方法
,路径
和回调函数
组成。
const express = require('express')
const app = express();
app.<method>(path,callback)
app.get(path,callback) //创建get路由
app.post(path,callback)//创建post路由
app.all(path,callback) //匹配所有的请求方法
app.listen(port,callback) //监听端口
2.2.3 express中间件
中间件的作用是使用函数封装公共操作,简化代码。分为全局中间件、路由中间件。
2.2.4 模块化
module.exports = <xx>
2.3 ejs模板引擎
2.3.1 模板引擎
模块引擎是分离用户界面和业务数据的一种技术,ejs将HTML和js分离。
<!--执行JS代码:--> <% code %>
<!--输出在转义的数据到模板上:--> <%= code %>
<!--输出非转义的数据到模板上:--> <%- code %>
2.4 mongoDB
2.4.1 MongoDB基本概念
MongoDB是一个基于分布式文件存储的数据库,有三个重要概念——数据库、集合、文档。在cmd
窗口运行输入mogod启动,可以打开另一个窗口使用mongo命令连接本机的mongodb服务。
2.4.2 常用命令
/* 数据库命令 */
show dbs //显示所有数据库
use dbs //切换到指定的数据库
db //显示当前所在的数据库
db.dropDatabase() //删除当前数据库
/* 集合命令 */
db.createCollection('集合名称') //创建集合
show collections //显示当前数据库中所有集合
db.集合名.drop() //删除某个集合
db.集合名.renameCollection('newName') //重命名集合
/* 文档命令 */
db.集合名.insert(文档对象) //插入文档
db.集合名.find(查询条件) //查询条件
db.集合名.update(查询条件,新的文档) //更新文档
db.集合名.remove(查询条件) //删除文档
2.5 会话控制
2.5.1 会话控制
会话控制是对会话进行控制,常见会话控制有三种:cookie、session、token。
2.5.2 cookie
cookie是HTTP服务器发送到用户浏览器并保存到本地的一小块数据。浏览器向服务器发送请求时,会自动将当前域名下可用的 cookie 设置在请求头中,然后传递给服务器。
2.5.3 session
session是保存在服务器端的一块数据,保存当前访问用户的相关信息。session可以实现会话控制,可以识别用户身份,快速获取当前用户的身份。
2.5.4 token
token是服务端生成并返回给HTTP客户端的一串加密字符串,token中保存着用户信息。token可以实现会话控制,可以识别用户身份,主要用于移动端APP。
2.5.5 JWT
JSON Web Token是目前最流行的跨域认证解决方案,可用于基于token的身份验证。
jwt.sign(数据,加密字符串,配置对象)
jwt.verify()
3. 问题与解决
Mongoose报错:Query.prototype.exec()
不接收回调函数
安装的mongoose版本过高。accounts文件夹下的node_modules不包含mongodb有关的包,accounts根目录下的node_modules包含mongodb、mongodb-connection-string-url、mongoose等包。
router.get('/account', function(req, res, next) {
AccountModel.find().sort({time:-1}).exec((err,data)=>{
if(err){
res.status(500).send('读取失败');
return;
}
res.render('list',{accounts:data,moment:moment});
})
});