先创建一个表示内容数据的类(Class),在这个类里面可以描述一下内容数据的样子,就是说明一下内容数据里面都有哪些属性,对应的数据类型是什么。
在 src/post 里面新建一个文件,名字叫 post.model.ts,在这个文件里可以导出一个 class,名字叫 PostModel,用这个类描述一下用户发布的内容这种数据。添加一个 id 后面加上一个 ? 号,表示这是一个可选的属性,属性的类型是 number,就是数字。
再添加一个 title ,它也是个可选的属性,类型是 string,还需要一个 content 属性,它也是可选的,类型是 string。
打开 post.service,在这个文件里定义一个新的函数,它可以创建内容。export 一个 createPost ,它是一个 async 函数,因为函数里面要做一些异步的动作,用箭头函数的形式定义它。
函数接收一个 post 参数,参数值的类型可以设置成 PostModel。 这里编辑器自动给我们导入了这个 PostModel,这个东西来自当前目录下的 post.model。
继续编辑这个 createPost 函数,下面可以准备一段查询,添加一个 statement ,用一个字符模板,里面添加一段 SQL,插入新的数据记录可以使用 INSERT INTO 数据表是 post,再用 SET 设置一下数据记录的值,这里用一个 ? 号表示。在执行这段 SQL 的时候要给这个 ? 号提供一个具体的值。这样做是为了安全。
下面从执行的结果里面解构出来它的第一个项目的值,名字可以叫做 data, await 用一下 connection 上的 promise 返回一个 Promise 继续执行 query 这个方法,把要执行的 SQL 交给这个方法。
因为要执行的这段 SQL 里面用了 ? 号,所以这里要指定一下这个 ? 号的具体的值,可以让它作为 query() 方法的第二个参数,这里可以用一下 post,也就是这个 createPost 函数接收的参数。
最后让这个函数提供一个数据,这里就是执行查询得到的结果,return data 。
打开 post.controller,先在这个文件的顶部导入需要用的服务函数,从 post.service 里导入 createPost。
然后在这个文件里再去定义创建内容接口需要的处理器,导出一个函数,名字叫 store,这个函数是个异步函数,所以用 async 标记一下,用箭头函数的写法定义这个函数,函数里面有几个参数,一个是 request,它的类型是 Request,还有 response,类型是 Response,还有一个 next,类型是 NextFunction。
在这个函数的主体里面先准备好需要存储的数据,从请求的主体里,把 title 还有 content 这两个属性解构出来,来自 request.body。
下面可以尝试创建内容,放在一个 try catch 区块里面,把要做的事情放在 try 里面,添加一个 data,await 用一下 createPost,要把存储在数据仓库里的内容数据交给这个函数,一个对象,里面有 title 还有 content。
然后要做出一个响应,用一下 response,先调用它的 status 把响应的状态码设置成 201,接着继续调用 send 做出响应,响应的数据可以是 data。
如果发生异常情况,可以在 catch 里面处理一下,这里可以执行 next() 把 error 交给它。这样会把异常交给应用默认的异常处理器去处理。
最后可以再去定义创建内容接口,打开 post.router,在这个文件里定义 创建内容 接口,用一下 router 上的 post 方法定义这个接口,接口的地址是 /posts,接口的处理器设置成 postController.store 。