逐步实现Node.js+express增删改查( 二 )

逐步实现Node.js+express增删改查( 二 )

知识储备

insert

创建插入查询,将要插入行的属性的哈希或插入的数组作为单个插入命令执行。使用包含插入模型的第一个插入标识的数组或者包含所有插入的postgresql标识的数组或Amazon Redshift的行数解析承诺/实现回调。insert 创建插入查询,将要插入行的属性的哈希或插入数组

1
2
3
4
5
// Returns [1] in "mysql", "sqlite", "oracle"; [] in "postgresql" unless the 'returning' parameter is set.
knex('books').insert({title: 'Slaughterhouse Five'})

//输出
insert into `books` (`title`) values ('Slaughterhouse Five')

Where 语句

有几种方法可以帮助动态地从句。在很多地方,函数可以用来代替值,构造子查询。在大多数地方,现有的knex查询可能用于组成子查询等。

这里我们用到的是对象语法

1
2
3
4
5
6
7
knex('users').where({
first_name: 'Test',
last_name: 'User'
}).select('id')
..
//输出
select `id` from `users` where `first_name` = 'Test' and `last_name` = 'User'

对于asyncawait关键字的理解

第一步添加增删改查方法models/user.js

添加insert、updata、delete方法

使用knex知识

1
2
3
4
5
6
7
8
9
10
11
12
13
//举例
//.catch()是一种简单的处理错误的方法大致都一样所以不需要太大修改根据实际情况走
//then() 方法返回一个 Promise 。它最多需要有两个参数:Promise 的成功和失败情况的回调函数。
insert: function(params){
return new Promise((reslove,reject)=>{
knex(TABLE).insert(params)
.then( res => {
reslove(res)
}).catch( err => {
reject(err)
})
})
},

第二步在controllers/user.js 添加增删改查的参数和逻辑

请求 Req.body 包含请求正文中提交的键值对数据

响应 Res.json 发送JSON响应。此方法使用JSON.stringify发送响应(具有正确的内容类型),该响应是转换为JSON字符串的参数。

该参数可以是任何JSON类型,包括对象,数组,字符串,布尔值,数字或null,您还可以使用它将其他值转换为JSON。

例1:

1
res.json({ code: 200, data: users})

例2:

1
2
3
res.json(null);
res.json({ user: 'tobi' });
res.status(500).json({ error: 'message' });
res.render(view [,locals] [,callback])

Locals 是一个对象,其属性定义视图局部变量

callback 一个回调函数如果提供,则该方法返回可能的错误和呈现的字符串,但不执行自动响应。发生错误时,该方法在next(err)内部调用。

例子中

1
res.render('user/show.tpl',res.locals)

Res.locals 包含作用于请求的响应局部变量对象,因此仅对在请求响应周期呈现的视图可用

此属性对于公开请求级别信息(例如请求路径名,经过身份验证的用户,用户设置等)非常有用

1
2
3
4
5
app.use(function(req, res, next){
res.locals.user = req.user;
res.locals.authenticated = ! req.user.anonymous;
next();
});

第三步请求数据

把基本设施建设完毕以后我们需要把我们的东西运送出去这个任务我们需要交给我们的路由去处理

路由方法

Express 支持对应于 HTTP 方法的以下路由方法:getpostputheaddeleteoptionstracecopylockmkcolmovepurgepropfindproppatchunlockreportmkactivitycheckoutmergem-searchnotifysubscribeunsubscribepatchsearchconnect

1
2
3
4
// 同一个接口地址,但是不同的请求方法
router.post('/user' , userController.insert);
router.put('/user' , userController.update);
router.delete('/user' , userController.delete);

第四步展现出来

给show.tpl添加jquery点击事件等

$.ajax()

该方法用于执行Ajax请求常用与其他jquery ajax请不能完成的请求

可选字段

Url: 链接地址,字符串表示

Data: 需要发送到服务器的数据 GET与POST都可以

Type: 请求类型

Timeout: 请求超时时间

Cache: 是否缓存请求结果bool表示

contentType: 内容类型

dataType: 服务器响应数据类型字符串表示当填写为json时,回调函数中无需再对数据反序列化为json

Success: 请求成功后服务器回调的函数

Error: 请求失败后服务器回调的函数

Complete: 请求完成后调用的函数无论请求成功还是失败都会调用该函数如果设置了success与error函数,则该函数在它们之后被调用

Async: 是否异步处理 bool表示 默认true设置该值为false后,JS不会向下执行,而是原地等待服务器返回数据,并完成相应的回调函数后,再向下执行

Username: 访问认证请求中携带的用户名,字符串表示

Password: 返回认证请求中携带的密码,字符串表示

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
delete: function(){
let id = $(this).data('id');

$.ajax({
url: '/api/user',
data: { id },
type: 'DELETE',
success: function(data) {
if(data.code === 200){
alert('删除成功!')
location.reload()
}else{
console.log(data)
}
},
error: function(err) {
console.log(err)
}
})
},

例子下载