下面我们一块儿定义一个更新内容用的接口。
打开 post.service,在这个文件里定义一个可以更新内容用的函数。export 一个函数,名字叫 updatePost,它是一个异步函数,用 async 标记一下,函数有两个参数,一个是 postId,内容的 ID 号,类型是 nubmer。还有一个 post,更新的内容,类型是 PostModel。
用箭头函数的形式定义它,在函数的主体里面先准备一个查询,名字叫 statement,用一个字符模板,然后设置一下要交给数据仓库服务执行的 SQL,更新内容可以使用 UPDATE ,更新是 post 这个数据表格,用 SET 设置一下更新的内容,可以用 ? 号表示。再用 WHERE 设置一个条件,条件是 id 等于 ? 号。
在这个 SQL 语句里有两个问号,第一个问号应该是要更新的内容,第二个问题的值应该是要更新的内容的 ID 号,执行这段 SQL 的时候要提供这两个值。
const 方括号,data ,await 等待执行 connection 用一下 promise() 返回一个 Promise,接着用 query() 方法执行一段 SQL ,要执行的就是 statement 里面设置的 SQL,这段 SQL 里用了两个 ? 号,所以这里要提供它们的值,让它作为 query() 方法的第二个参数,可以用一个数组,里面有两个项目,第一个项目就是要更新的内容,这里就是 updatePost 这个函数的 post 这个参数,第二个项目是内容的 ID,这里可以设置成 postId 。 下面让这个函数提供一个数据,可以让它 return 这个 data 。
打开 post.controller ,在这个文件里定义更新内容接口需要的接口处理器,export 一个函数,名字可以叫 update,它是一个异步函数,用 async 标记一下。用箭头函数的写法定义这个函数。
它里面有几个参数,request 类型是 Request,还有一个 response,类型是 Response,还有一个 next,类型是 NextFunction。
在这个函数的主体里面,可以先获取到要更新的内容的 ID 号,这个 ID 可以从请求的地址参数里面得到,名字是 postId,这个东西来自 request.params,它里面包含的就是所有的地址参数。
然后可以再去准备一下要更新的数据,这个数据是客户端那里提供的,从请求的主体里,把 title 还有 content 解构出来,来自 request.body 。
下面可以执行一下 更新,用一组 try catch, 在 try 区块里,添加一个 data。它的值是执行 updatePost 返回的结果,执行它的时候前面加上一个 await,执行 updatePost, 这里编辑器自动从 post.service 里面导入这个 updatePost。
这个函数需要两个参数,parseInt 处理一下 postId,把它转换成 10 进制的数字。第二个参数是要更新的内容,一个对象,里面添加一个 title 还有 content。
然后可以作出响应,用一下 response.send ,响应的数据就是执行 updatePost 返回的结果,这里就是 data 。
在 catch 里处理一下发生的异常,出现异常,执行 next 函数,带着 error,这样会使用应用默认的异常处理器去处理。
打开 post.router,在里面定义一个更新内容用的接口。用的是 router 上的 patch() 方法,这个方法可以定义支持 HTTP 的 PATCH 方法使用的接口。接口地址是 /posts/:postId
接口的处理器设置成 postController.update。