内置服务
在我们生成模板项目的时候,已经有一个服务了:app.service.ts
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
这个服务其实是一个类,是一个被@Injectable装饰器装饰的类,在app.module.ts中引入并配置
如果哪里用到这个服务,就在哪里注入,比如在app.controller.ts中去调用服务里面的方法
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
创建服务
nest g service cart
nest g provicer cart
constructor(private cartService:CartService){}
开发模板结构化配置
1 ) cookie的初步使用
对用户信息进行标识,让用户多个页面信息共享,这时候我们就要基于cookie和session来处理
Nestjs默认使用express的HTTP配置时,我们可以安装express相关的插件,比如:cookie-parse
$ yarn add cookie-parser
, 在main.ts中进行引入,并配置中间件
// main.ts
import * as cookieParser from 'cookie-parser';
// 配置cookie中间件
app.use(cookieParser()); // 注意cookieParser中最好传入一个密钥, 可以做加密,也可以不启用加密
在控制器中测试cookie
import {Get, Response} from '@nestjs/common';
@Controller('user')
export class ArticleController {
@Get()
index(@Response()) res {
// 设置cookie 有效期1天,只有后端可读取cookie
res.cookie("username", "Joh", {maxAge: 1000 * 60 * 60 * 24, httpOnly: true})
res.send('');
// return ''; // 注意,一定要用send,而不能return, 否则无法响应
}
// 读取cookie
@Get('cookie')
getCookie(@Request() req) {
console.log(req.cookies.username);
return 'req.cookies.username';
}
}
cookie 常用配置如下
domain String 域名
expires Date 过期时间(second),时间点后cookie失效
httpOnly Boolean 通过程序(js脚本,applet)无法读取cookie, 防止XSS攻击
maxAge String 最大失效时间(毫秒) 设置在多少后失效
secure Boolean 如果设置true, 则只在https中生效
path String cookie影响到的路径,默认根路径 / 如果设置的路径不匹配,则无法携带cookie
signed Boolean 是否签名cookie, 设置为true则对这个cookie签名,需要用到res.signedCookies 而非res.cookies访问;被篡改后的签名会被服务器拒绝,cookie并会被重置
2 ) cookie的加密处理
app.use(cookieParser(‘您的密钥’));
import {Get, Response} from '@nestjs/common';
@Controller('user')
export class ArticleController {
@Get()
index(@Response()) res {
// 设置cookie 有效期1天,httpOnly只有后端可读取cookie,signed加密cookie
res.cookie("username", "Joh", {maxAge: 1000 * 60 * 60 * 24, httpOnly: true, signed: true})
res.send('');
// return ''; // 注意,一定要用send,而不能return, 否则无法响应
}
// 读取cookie
@Get('cookie')
getCookie(@Request() req) {
console.log(req.signedCookies.username); // 获取加密后的cookie, 如果不这样写,按正常写则会是undefined
return 'req.cookies.username';
}
}
注意,使用request对象时,如果基于Render的装饰器来处理模板引擎,则可以使用return来包装数据
import {Get, Response, Render} from '@nestjs/common';
@Controller('user')
export class ArticleController {
@Get()
@Render('default/user');
index(@Response()) res {
// 设置cookie 有效期1天,httpOnly只有后端可读取cookie,signed加密cookie
res.cookie("username", "Joh", {maxAge: 1000 * 60 * 60 * 24, httpOnly: true, signed: true});
// 注意这里直接 return
return {name: 'Joh'};
}
}
1 )安装express-session
yarn add express-session
2 ) 配置 express-session
import * as session from 'express-session';
app.use(session({secret: 'keyboard cat', cookie: {maxAge: 1000 * 60 * 60 * 24}}));
3 ) 使用session
// 这里只写关键代码
index(@Request() req): string {
// 设置session
req.session.username = req.signedCookies.username;
}
4 ) session的常用配置
app.use(
session(
{
name: 'c.sid', // 返回客户端的 key 的名称,默认为 connect.sid,也可以自己设置
secret: 'keyboard cat', // 密钥,一个 String 类型的字符串,作为服务器端生成 session 的签名
resave: false, // 强制保存 session 即使它并没有变化,。默认为 true。建议设置成 false
saveUninitialized: true, // 强制将未初始化的 session 存储。当新建了一个 session 且未设定属性或值时,它就处于未初始化状态。在设定一个cookie前,这对于登陆验证,减轻服务端存储压力,权限控制是有帮助的。(默 认:true)。
cookie: {maxAge: 1000 * 60 * 60 * 24} // cookie配置,设置返回到前端 key 的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。
rolling: true, // 在每次请求时强行设置 cookie,重置 cookie 过期时间(默认:false)
}
)
);
// //设置 session
req.session.username='Joh';
// 获取 session
req.session.username;
// 重新设置 cookie 的过期时间
req.session.cookie.maxAge=0;
// 销毁 session
req.session.destroy(function(err) { /* ToDo */ })