什么是集成响应? 在你的业务中肯定会需要自定义状态码, headers返回头, 在传统的nodejs开发中,比如koa中是这样写的:

  1. response.body = {
  2. ...
  3. }

那么同样的, sword集成响应可以轻松的帮你完成这个需求, 所以我们在useApi中新增了一个特性:

  1. import { useApi } from '@swordjs/sword-framework';
  2. import { ReqQuery, ReqParams, Res } from './proto';
  3. export default useApi<{
  4. query: ReqQuery;
  5. params: ReqParams;
  6. res: Res;
  7. }>({
  8. handler: async (ctx) => {
  9. return () => ({
  10. statusCode: 200,
  11. statusMessage: 'success',
  12. headers: {},
  13. data: {
  14. message: 'Hello, World!'
  15. }
  16. });
  17. }
  18. });

runtime会检查你的返回值, 如果是函数, 你在IDE中不仅会获得类型提示, 还会返回集成响应, 意味着你不需要任何学习成本, 只需要更改为函数返回值就可以了😄 !
useApi返回函数的返回值类型如下:

  1. export type CustomHandlerReturn<D = any> = () => {
  2. statusCode?: number;
  3. statusMessage?: string;
  4. data?: UnPromisify<D>;
  5. headers?: Record<string, string>;
  6. };

我们可以指定, 状态码等等信息, 都是可选的, 都有一个安全的默认值:

statusCode 默认值: 200
statusMessage 默认值: “”
data 默认值: {}
headers 默认值: {}

平台差异

集成响应在不同的平台表现是一样的, 首先集成响应的设计是参照了h3的error设计 (即server端), 它的数据结构是这样的:

  1. {
  2. statusCode: 404,
  3. statusMessage: "not found",
  4. stack: []
  5. }

判断当前的statusCode是否是2xx, 如果不是2xx会直接触发服务器错误, 并且你指定的statusMessage和data都会被返回; 反之将会直接返回data中的内容

server

  1. export default useApi<{
  2. query: ReqQuery;
  3. params: ReqParams;
  4. res: Res;
  5. }>({
  6. handler: async (ctx) => {
  7. return () => ({
  8. statusCode: 404,
  9. statusMessage: 'custom error',
  10. headers: {
  11. foo: '666'
  12. },
  13. data: {
  14. message: 'Hello, World!'
  15. }
  16. })
  17. }
  18. });

image.png

如果当前是2xx:

  1. {
  2. "message": "Hello, World!"
  3. }

unicloud

unicloud平台分为应用内调用和云函数url化, 应用内调用和server端无异, 但是在云函数url化中, sword做了一些特殊的处理

云函数url化

框架会返回一个unicloud的集成响应, 数据结构如下, 你在业务中无需关心:

  1. {
  2. mpserverlessComposedResponse: true, // 使用阿里云返回集成响应是需要此字段为true
  3. isBase64Encoded: false, // 硬编码
  4. statusCode: customResult.statusCode,
  5. body: result,
  6. headers: customResult.headers
  7. };

注意事项

  • 如果状态码返回204, 如果在http环境, 将不会显示任何data内容, 但是headers是正常的.