上一篇创建了一个应用,并运行成功。接下来我们开始了解一下这个应用的结构,手动写一个小例子。
1. 了解项目结构
用VScode打开项目,可以看见以下的项目结构:

2. 后端部分
后端部分,我们主要修改的是红色 框住的部分

先把文件删掉,只保留下文件夹

我们要实现一个计算工资的例子:如 100 + 200 = 300
在 shared\protocols 目录下开始新建文件。

文件必须以Ptl开头,在文件中分别定义请求接口,和相应接口
请求接口:以Req开头
相应接口:以Res开头
这里定义好了数据类型,tsrpc框架可以直接帮你拦截掉,非定义的数据类型,而不用去担心数据转化的问题。
定义完毕后,就可以开始实现这个接口了。
我们会把实现,放在 api 这个文件夹下,你也可以直接使用命令来自动生成实现的文件。
使用命令 npm run proto

会生成一个 serviceProto.ts的文件,这个文件包含了所有的接口信息,是tsrpc运行时使用的文件。如接口的定义,输入输出的定义等信息。
import { ServiceProto } from 'tsrpc-proto';
import { ReqGetSalary, ResGetSalary } from './PtlGetSalary';
export interface ServiceType {
api: {
"GetSalary": {
req: ReqGetSalary,
res: ResGetSalary
}
},
msg: {
}
}
export const serviceProto: ServiceProto<ServiceType> = {
"services": [
{
"id": 0,
"name": "GetSalary",
"type": "api"
}
],
"types": {
"PtlGetSalary/ReqGetSalary": {
"type": "Interface",
"properties": [
{
"id": 0,
"name": "salary1",
"type": {
"type": "Number"
}
},
{
"id": 1,
"name": "salary2",
"type": {
"type": "Number"
}
}
]
},
"PtlGetSalary/ResGetSalary": {
"type": "Interface",
"properties": [
{
"id": 0,
"name": "result",
"type": {
"type": "Number"
}
}
]
}
}
};
生成这个文件之后,再输入命令 npm run api ,就可以生成接口的实现了

ApiGetSalary.ts的内容如下:
import { ApiCall } from "tsrpc";
import { ReqGetSalary, ResGetSalary } from "../shared/protocols/PtlGetSalary";
export default async function (call: ApiCall<ReqGetSalary, ResGetSalary>) {
// TODO
call.error('API Not Implemented');
}
在tsrpc中,所有的请求参数,和返回参数,都是通过异步函数call 来获取的。
这里检单实现一下加法,参数1加参数2,并把结果返回。
import { ApiCall } from "tsrpc";
import { ReqGetSalary, ResGetSalary } from "../shared/protocols/PtlGetSalary";
export default async function (call: ApiCall<ReqGetSalary, ResGetSalary>) {
call.succ({
result: call.req.salary1 + call.req.salary2
});
}
注意:要把函数名加上,这里ApiGetSalary
import { ApiCall } from "tsrpc";
import { ReqGetSalary, ResGetSalary } from "../shared/protocols/PtlGetSalary";
export async function ApiGetSalary(call: ApiCall<ReqGetSalary, ResGetSalary>) {
call.succ({
result: call.req.salary1 + call.req.salary2
});
}
3. 测试后端的接口
打开文件夹 /test/api/ 就会看见一个已经写好的测试文件 data.test.ts 把里面的内容删掉一部分,只保留以下
import assert from 'assert';
import { HttpClient, TsrpcError } from 'tsrpc';
import { serviceProto } from '../../src/shared/protocols/serviceProto';
// 1. EXECUTE `npm run dev` TO START A LOCAL DEV SERVER
// 2. EXECUTE `npm test` TO START UNIT TEST
describe('ApiGetData', function () {
//创建一个客户端
let client = new HttpClient(serviceProto, {
// 本地测试,使用 HTTP 协议
server: 'http://127.0.0.1:3000',
// 显示日志,显示在console里面
logger: console
});
})
改为以下内容:测试我们写的GetSalary接口
import assert from 'assert';
import { HttpClient, TsrpcError } from 'tsrpc';
import { serviceProto } from '../../src/shared/protocols/serviceProto';
// 1. EXECUTE `npm run dev` TO START A LOCAL DEV SERVER
// 2. EXECUTE `npm test` TO START UNIT TEST
describe('ApiGetData', function () {
//创建一个客户端
let client = new HttpClient(serviceProto, {
// 本地测试,使用 HTTP 协议
server: 'http://127.0.0.1:3000',
// 显示日志,显示在console里面
logger: console
});
// 测试用例
it('Success', async function () {
// 1. 调用API
let ret = await client.callApi('GetSalary', {
salary1: 100,
salary2: 200
});
if (!ret.isSucc) {
console.log(ret.err.message);
return;
}
console.log(ret.res.result);
})
})
改完之后,就可以进行测试了:
输入 命令 npm run test 运行测试用例

提示测试成功。
也可以使用assert 断言的方式进行测试
import assert from 'assert';
import { HttpClient, TsrpcError } from 'tsrpc';
import { serviceProto } from '../../src/shared/protocols/serviceProto';
// 1. EXECUTE `npm run dev` TO START A LOCAL DEV SERVER
// 2. EXECUTE `npm test` TO START UNIT TEST
describe('ApiGetData', function () {
//创建一个客户端
let client = new HttpClient(serviceProto, {
// 本地测试,使用 HTTP 协议
server: 'http://127.0.0.1:3000',
// 显示日志,显示在console里面
logger: console
});
// 测试用例
it('Success', async function () {
// 1. 调用API
let ret = await client.callApi('GetSalary', {
salary1: 100,
salary2: 200
});
//使用断言方式测试
assert.deepStrictEqual(ret, {
isSucc: true,
res: {
result: 300
}
});
})
})
使用断言时,必须先要启动后端服务,再运行测试

再运行断言测试


1644

被折叠的 条评论
为什么被折叠?



