徐振震

徐振震 查看完整档案

上海编辑东华大学  |  软件与理论 编辑阿里巴巴  |  前端工程师 编辑 github.com/helloyou2012 编辑
编辑

A man like beautiful things!

个人动态

徐振震 回答了问题 · 2019-09-17

eggjs 是如何做到在dev模式代码变化自动重启的?

egg 内置的 egg-watcher

关注 3 回答 2

徐振震 发布了文章 · 2019-03-08

让我们来重新设计一下 koa-router

前言

koa-router 是目前用的比较多的 Koa 的路由中间件之一,前段时间由于作者没有精力继续维护而将其公开售卖。我们有些项目也用到了这个库,但是目前很多我们想要的特性都没有,比如生成接口文档。本身这个库代码实现还比较简单,因此综合考虑打算重写一个。

项目地址:https://github.com/d-band/koa...

特性:

  • 支持几乎所有的 koa-router 特性
  • 支持 params 校验
  • params 支持从 path, header, query, cookie 中获取
  • 支持 body parser
  • 支持 request body 校验
  • 支持参数类型自动转换
  • 支持自动生成 OpenAPI

简单例子:

index.js

import Koa from 'koa';
import Mapper from 'koa-mapper';
import * as service from './service';

const Mapper = new Mapper();

mapper.get('/users/:id/projects', {
  params: {
    id: { type: 'number' },
    status: { type: 'array<string>', in: 'query' },
    token: { type: 'string', in: 'header' }
  }
}, service.getProjects);

mapper.post('/users/:id/projects', {
  params: {
    id: { type: 'number' }
  },
  body: 'Project'
}, service.addProject);

mapper.schema('Project', {
  id: { type: 'number', required: true },
  name: { type: 'string', required: true },
  status: { type: 'array<Status>', required: true }
});

mapper.schema('Status', {
  id: { type: 'integer' },
  name: { type: 'string' }
}, {
  required: ['id', 'name']
});

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

app.listen(3000);

// open http://localhost:3000/openapi.json

service.js

export async function getProjects(ctx) {
  const { id, status, token } = ctx.params;

  await checkToken(id, token);

  ctx.body = await Project.findAll({
    where: {
      userId: id,
      status: { $in: status }
    }
  });
}

export async function addProject(ctx) {
  const { body } = ctx.request;

  ctx.body = await Project.create({
    ...body,
    userId: id
  });
}

路由定义:

mapper.get(path, [options], ...middlewares);
mapper.post(path, [options], ...middlewares);
mapper.put(path, [options], ...middlewares);
mapper.del(path, [options], ...middlewares);
...

options 为可选参数,包含:

  • name: 路由名称
  • params: 请求参数定义
  • body: 请求 Body 定义
  • 其他 OpenAPI 中 Operation Object 的参数

options.params 为请求参数定义,如:

params = {
  id: { type: 'number' },
  name: { type: 'string', in: 'query' },
  user: { type: 'User', in: 'query' }
}
  • type: 参数类型,包含基本类型(numberstringintegerdatetimedatetime),数组类型(array<string>),自定义类型(如 User),自定义数组类型(array<User>),多个类型(number|string
  • in: 参数来源,包含 path,header,query,cookie
  • 其他 OpenAPI 中 Parameter Object 的参数

自定义类型

mapper.define(schemaName, properties, options);
// or
mapper.schema(schemaName, properties, options);

支持类型组合,如:

mapper.schema('Status', {
  id: { type: 'integer' },
  name: { type: 'string' }
}, {
  required: ['id']
});
mapper.schema('Project', {
  id: { type: 'number', required: true },
  name: { type: 'string', required: true },
  status: { type: 'array<Status>', required: true }
});

支持继承,如:

mapper.schema('Model', {
  id: { type: 'number' },
  createdAt: { type: 'datetime' },
  updatedAt: { type: 'datetime' }
});
mapper.schema('User: Model', {
  name: { type: 'string' }
});

Body Parser

mapper.post('/users', {
  body: 'User'
}, (ctx) => {
  const { id, name } = ctx.request.body;
});

支持文件上传,如:

mapper.post('/uploadImage', {
  bodyparser: { multipart: true },
  body: {
    user: { type: 'number' },
    image: { type: 'file' }
  }
}, (ctx) => {
  const { user, image } = ctx.request.body;
});

结尾

目前 koa-mapper 刚发布,测试覆盖率达到 100%,有哪些有兴趣的小伙伴欢迎一起维护。

查看原文

赞 0 收藏 0 评论 0

徐振震 回答了问题 · 2019-02-20

解决sublime 如何自定义标签包裹ejs内容

一般对选中文本的进行处理需要用 snippet + keymap。这里有个现成的可以实现你的效果:https://github.com/samholmes/...

如对应的 snippet 文件 ejs_insert_tags.sublime-snippet(快捷键 = + tab):

<snippet>
  <content><![CDATA[<%${1:= }${2:$SELECTION} %>$0]]></content>
  <description><![CDATA[<%(=) 'insert ejs tags' %>]]></description>
  <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
  <tabTrigger>=</tabTrigger>
  <!-- Optional: Set a scope to limit where the snippet will trigger -->
  <scope>text.html</scope>
</snippet>

对应的 key binding(快捷键:ctrl + shift + .):

[{
  "keys": ["ctrl+shift+."],
  "command": "insert_snippet",
  "args": {
    "name": "Packages/User/ejs_insert_tags.sublime-snippet"
  }
}]

关注 2 回答 1

徐振震 回答了问题 · 2019-02-20

npm漏洞修复 audit查看报告后怎样处理?

提示的很明显,是 vue-photo-preview 依赖的 webpack-dev-server 版本有漏洞风险。这个在 webpack-dev-server@3.1.11 之后被修复了。但 vue-photo-preview 其实只依赖 photoswipe,其他的 15 个依赖都应该是 Dev Dependencies。建议不要用 vue-photo-preview 这个库,直接用 photoswipe 就可以。

关注 3 回答 2

徐振震 回答了问题 · 2018-12-07

react 源码中有一个不是问题的问题,但是很困惑

这些都是编译后生成的,且只有没混淆过的代码是这样的,UglifyJS 处理之后的代码会将这些删除。真正的源码应该是类似这样的:

if (process.env.NODE_ENV !== 'production'){}

这个版本的 React 默认是开发模式,如果发布需要指定 NODE_ENV。另外你可以通过 UglifyJS 将这些代码处理掉。或者你可以直接引用混淆过的代码:

const React = require('react/dist/react.min.js');

详情见:https://github.com/facebook/r...

关注 3 回答 2

徐振震 分享了头条 · 2018-11-07

之前公司有些项目前端模板用的是 primer-template,这是一个语法和 EJS 类似的轻量级的 JS 模板。因为是轻量级的模板,所以有一些不足的地方: 不支持全局变量(如 window)不支持嵌套函数不支持 HTML Encode前两个不足是因为这个模板使用的 JS 编译器是 homunculus...

赞 0 收藏 0 评论 0

徐振震 回答了问题 · 2018-09-16

nunjucks 如何渲染标签内参数?

<li onclick="edit({{item._id}})" data-id="">

关注 2 回答 1

徐振震 赞了回答 · 2018-05-31

解决用python将txt文档写入MySQL数据库遇到问题

在 python 的交互解释器里,一个 if for while 等这样的语句块被作为一条语句执行,而你下面的 f.close() 和 while 不是同一个语句块,你写在一起,解释器认为 f.close() 是 while 语句块里面的,但缩进却不对

关注 4 回答 5

徐振震 回答了问题 · 2018-05-31

解决用python将txt文档写入MySQL数据库遇到问题

f.close() 前面加个空行

PS: 尽量少用 REPL

关注 4 回答 5

徐振震 回答了问题 · 2018-05-18

webpack 逆向工程

可以参考下这个库:https://github.com/paazmaya/s...,其实就是把 source-map 库包了一层,直接用 source-map 也可以。

关注 4 回答 3

认证与成就

  • 获得 104 次点赞
  • 获得 8 枚徽章 获得 1 枚金徽章, 获得 1 枚银徽章, 获得 6 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

  • better-xlsx

    A better xlsx lib for: reader / writer / toHTML Table / fromHTML Table

  • dool

    Frontend dev tool based on webpack

  • yax

    Yet another store using redux. (Inspired by vuex and dva)

  • koa-orm

    koa orm using sequelize & squel

  • koa-view

    Template rendering middleware for koa (using nunjucks).

  • auth-center

    Auth center with OAuth 2.0 & TOTP

  • gantt

    甘特图组件(基于 canvas )

  • open-browser

    open-browser: a command-line http server for debug

注册于 2014-02-23
个人主页被 1.6k 人浏览