【随手记】 — 「xcrun」「koa2的ctx类型」「node图片处理sharp」

概要

  • xcrun可以用来XCode模拟器截图,能干什么自己发散吧
  • 后续一律都用ts搭配koa2做常规server开发了,ctx的类型还是得了解下
  • sharp,如果用node来做一些常规的图片处理,如裁剪、变色、加水印等,你会用什么呢

iOS模拟器截图

booted会自动给当前自动的模拟器截图,xcrun是个强大的XCode生态的命令行工具

xcrun simctl io your_simulator_UDID screenshot output_file_path.png




xcrun simctl io booted screenshot output_file_path.png


koa2+ts开发

在 Koa 的类型定义中,ctx 的类型通常被标记为 ParameterizedContext,这是一种复合类型,可以接收两个参数:一个表示状态(state)的类型,一个表示自定义的上下文对象。

不过,如果你没有自定义的状态或者上下文对象,你可以简单地使用 Context 类型。例如:

import { Context } from 'koa';




export class UserController {

    static async getUsers(ctx: Context) {
        const users = [
            { name: 'Tom', age: 20 },
            { name: 'Jerry', age: 18 }
        ];
        ctx.body = users;
    }

    static async getUserById(ctx: Context) {
        const users = [
            { id: '1', name: 'Tom', age: 20 },
            { id: '2', name: 'Jerry', age: 18 }
        ];
        const user = users.find(user => user.id === ctx.params.id);


        if (user) {
            ctx.body = user;
        } else {
            ctx.status = 404;
            ctx.body = { message: 'User not found' };
        }
    }
}

在这个示例中,我们使用了 Context 类型,它来源于 koa 库。这样就可以利用 TypeScript 的类型检查和自动完成功能来写更稳健的代码。

当然,如果你有自定义的状态或者上下文对象,你应该使用 ParameterizedContext 类型,例如 ParameterizedContext<YourStateType, YourCustomContextType>

在 Koa 框架中,获取 GET 和 POST 请求的参数,可以分别通过 ctx.queryctx.request.body 来获取。以下是一个使用 koa-bodyparser 进行解析 POST 请求体的例子。

首先,安装必要的依赖:

npm install koa-bodyparser

然后,我们可以创建一个新的 UserController 类来处理用户相关的请求:

import { ParameterizedContext } from 'koa';




export class UserController {

  static async getUser(ctx: ParameterizedContext) {
    // 获取 GET 请求的 query 参数
    const { id } = ctx.query;

    // 假设我们有一个函数可以通过 id 获取用户
    const user = await getUserById(id);

    ctx.body = user;
  }


  static async createUser(ctx: ParameterizedContext) {
    // 获取 POST 请求的 body 参数
    const { name, age } = ctx.request.body;

    // 假设我们有一个函数可以创建新用户
    const newUser = await createUser({ name, age });

    ctx.body = newUser;
  }
}

在这个例子中,getUser 方法是处理 GET 请求的,它通过 ctx.query 来获取查询参数。createUser 方法是处理 POST 请求的,它通过 ctx.request.body 来获取请求体。

然后在路由中使用:

import Router from 'koa-router';
import { UserController } from './UserController';

const router = new Router();


router.get('/user', UserController.getUser);
router.post('/user', UserController.createUser);


export default router;

并在 Koa 应用中使用 koa-bodyparser 和路由:

import Koa from 'koa';


import bodyParser from 'koa-bodyparser';
import router from './router';


const app = new Koa();


app.use(bodyParser());
app.use(router.routes()).use(router.allowedMethods());


app.listen(3000);

这样就可以通过 GET 请求的查询参数和 POST 请求的请求体来获取请求参数了。注意,在 POST 请求中,必须使用一些中间件(如 koa-bodyparser)来解析请求体。

koa2静态文件

在 Koa2 中,可以使用 koa-static 这个中间件来实现静态资源的服务。首先,需要安装该库:

npm install koa-static

之后,可以在代码中这样使用:

import Koa from 'koa';


import Router from 'koa-router';

import serve from 'koa-static';

import path from 'path';


const app = new Koa();
const router = new Router();


router.get('/user/:id', (ctx) => {
  const { id } = ctx.params;
  const { name } = ctx.query;

  ctx.body = `User ID: ${id}, Name: ${name}`;
});

// 为 '/static' 路径提供静态资源服务
app.use(serve(path.resolve(__dirname, './static')));


app
  .use(router.routes())
  .use(router.allowedMethods());

app.listen(3000);

在上面的代码中,serve(path.resolve(__dirname, './static')) 将当前目录下的 static 文件夹设置为静态资源的根目录。然后通过 app.use 将其挂载到应用上。这样,你就可以通过访问类似于 http://localhost:3000/image.png 的 URL 来获取 static 文件夹下的 image.png 文件了。

请注意将 app.use(serve(...)) 放在其他路由之前,以确保当请求的路径匹配到静态资源时,可以直接返回,不再继续匹配其他路由。

静态文件资源路径

如果你想在静态资源路径之前加上一个固定的前缀(例如 img),可以使用 koa-mount 这个库。首先,安装该库:

npm install koa-mount

然后在代码中这样使用:

import Koa from 'koa';


import Router from 'koa-router';

import serve from 'koa-static';

import mount from 'koa-mount';
import path from 'path';


const app = new Koa();
const router = new Router();


router.get('/user/:id', (ctx) => {
  const { id } = ctx.params;
  const { name } = ctx.query;


  ctx.body = `User ID: ${id}, Name: ${name}`;
});

// 在静态资源的路径前添加 '/img' 前缀
app.use(mount('/img', serve(path.resolve(__dirname, './static'))));

app
  .use(router.routes())
  .use(router.allowedMethods());

app.listen(3000);

在上面的代码中,mount('/img', serve(path.resolve(__dirname, './static'))) 会在静态资源的路径前添加一个 /img 前缀。这样,你就可以通过访问类似于 http://localhost:3000/img/image.png 的 URL 来获取 static 文件夹下的 image.png 文件了。

node图片处理

Sharp 是一个非常强大且功能齐全的 Node.js 图像处理库,它支持很多功能,包括图像的裁剪、调整大小、旋转、翻转、调整亮度、对比度、饱和度和色调,转换图像格式,优化 JPEG 和 PNG 图像的大小等。它的 API 设计也相当简洁和直观,十分适合在 TypeScript 中使用。

另外,Sharp 的性能也非常好,它使用 libvips 库进行图像处理,这个库是专门针对大量并发处理进行优化的,通常来说,它的性能要优于 ImageMagick 和 GraphicsMagick。

Sharp 的社区也很活跃,它在 GitHub 上有超过 17,000 的 star,有超过 100 个贡献者,并且有大量的开发者正在使用它。所以,当你遇到问题时,你可以很容易地在网上找到相关的解决方案或者向社区求助。

这是一个简单的 Sharp 使用示例:

import sharp from 'sharp';




sharp('input.png')
  .resize(200, 200)
  .toFile('output.png', (err, info) => {
    // handle error or success
  });

但请注意,Sharp 是一个原生 Node.js 插件,这意味着它在你的系统上需要编译 C++ 代码。大多数情况下,这个过程都是自动的,但在某些环境中,你可能需要安装额外的工具。在部署到云服务提供商时,也可能会遇到一些额外的挑战。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYxBzFe5' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片