Skip to content

godgnidoc/jetweb

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

0. 概述

jetweb框架是超轻量级web服务框架,具备访问路径自动映射请求参数自动注入跨域资源共享自动应答等功能。在小规模,项目上可以有效降低开发工作量。

jetweb仅适用于开发web后端程序,因为jetweb对接口的请求,返回格式做出了限定,以此追求便捷的自动映射功能。

jetweb使用单一的服务器对象混合支持http,httpswebsocket

1. 快速入门

1.0. 安装

推荐使用npm包管理工具安装jetweb

npm install jetweb

1.1. HelloWorld

以下typescript源码展示了如何轻松建立一个web服务器

import {Web} from 'jetweb'

const web = new Web({
    User: {
        getSayHi() {
            return 'Hello world!'
        }
    }
})

web.listen()

运行这份源码,您就可以使用浏览器访问http://localhost:5000/user/say/hi地址查看到效果了。

1.2. 控制器与路径映射

jetweb的使用流程如下:

  1. 使用Web类构造web服务器
  2. 调用Web实例的listen方法

仅此而已,Web类的构造方法接受一个Application对象,内部的每个属性都会被认做一个Controller

Controller的每个方法都会被认做一个Handler

Handler可分为RequestHandlerWebsocketHandler两种,jetweb根据Handler的名称区分Handler的类型并映射访问路径。

关于如何书写具体的Handler名称,您可以参考实例:

import {Application} from 'jetweb'

let app : Application = {
    User: {
        getBrief() {/* GET: /user/brief */}
        postLogin() {/* POST: /user/login */}
        wsOnline() {/* WEBSOCKET: /user/login */}
        get() {/* GET: /user */}
    },
    '/': {
        get() {/* GET: / */}
    }
}

1.3. 请求体与参数注入

RequestHandler声明了参数,jetweb会在查询请求中寻找名称相同的字段,注入到参数中。

若请求头包含ContentType: application/json,则jetweb会试图解析请求体;若请求体被解析为object,则其中的属性也会被注入到参数中。

请注意:jetweb没办法为请求参数检查数据类型。

1.4. 返回值与响应对象

您在RequestHandler返回的除了undefined外的任何内容,都会被json编码后作为响应体发送。

jetweb运行RequestHandler时,一个RequestContext对象会被注入this引用。您可以通过this.response访问响应对象,以手动指定更多细节。

1.5. 请求对象

jetweb运行RequestHandler时,一个RequestContext对象会被注入this引用。您可以通过this.request访问请求对象,以获悉更多关于请求的信息。

1.6. 支持WebSocket

jetweb使用ws模块为您提供websocket的简单封装。您可以使用一个ws前缀的WebSocketHandler在某个路径上监听websocket请求。

let app : Application = {
    User: {

        /* listen to /user/online */
        wsOnline( request : http.IncomingMessage ) {
            console.log('connection to /user/online')

            /* bind event handler */
            this.on('message', (data) => {
                console.log('message received', data)

                /* echo back */
                this.send(data)
            })
        }
    }
}

websocket连接被建立时,一个WebSocket对象将被注入this引用。

若需要,您可以使用WebSocketHandler的第一个参数接受http.IncomingMessage来获悉更多关于此请求的信息。

编写WebSocketHandler相当于监听了ws.Server对象的connection事件,jetweb为所有的websocket连接使用同一个服务容器,再根据路径手动分配事件。

2. 服务器选项

jetweb服务器的构造方法还可以接受第二个参数,用于指定自定义的服务器选项。

服务器选项是一个ServerOptions对象,每一条选项都是其中的一个属性,所有的选项都是可选的。

2.0. 端口号

jetweb服务器默认监听5000端口,您可以使用如下代码指定jetweb服务器监听80端口。

new Web(app,{port:80})

2.1. 跨域资源共享

jetweb服务器对跨域资源共享提供了粗略简便的处理办法。

跨域资源共享会在浏览器向服务器提出复杂请求之前,发送一个header请求询问是否能够进行跨域资源共享。

默认情况下,如果您没有编写接口来处理这个header请求,此请求将以404失败告终。

您可以指定cors选项为true,这样jetweb服务器会为您自动允许所有的跨域资源共享询问。

new Web(app,{cors:true})

同时jetweb也会为所有的响应添加适用于任何网站的跨域许可头:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST
Access-Control-Allow-Headers: x-requested-with,content-type

您可以指定cors为一个订制的RequestHandler来处理一般的情况:

new Web(app,{cors:()=>{
    ...
}})

请允许我再次强调,跨域处理只发生在这个header请求没有被RequestHandler处理的情况下。也就是说,如果您想单独处理某个路径对应的header请求,这并不复杂:

new Web({
    user: {
        headerLogin() {
            /** do something */
        }
    }
})

2.2. 静态映射

默认情况下,jetweb会在每次请求到来时,拆解请求路径,然后与Controller对象中的Handler匹配。这个设计为Controller保留了动态变化的可能性,但是降低了性能。

您可以指定static选项为truejetweb将会在Web对象建立之初构造并启用一个一对一的静态映射表,提高运行效率。

new Web(app, {static: true})

2.3. 安全套接字

默认情况下,jetweb使用http服务器进行通信,如果您需要,可以传入ssl选项以开启https服务器。

ssl选项的内容参考https.ServerOptions结构。

new Web(app,{
    ssl:{
        key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
        cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
    }
})

请注意,当您开启了ssl选项时,WebSocketHandler也会受到影响,其对应的请求协议也会变成wss

2.4. 服务器选项

您可以使用http选项为http服务器指定更多选项,默认情况下此选项是空的。

import {Web} from 'jetweb'

let web = new Web(app, {
    http:{
        ...
    }
})

About

a very simple web framework for js

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published