jetweb
框架是超轻量级web
服务框架,具备访问路径自动映射,请求参数自动注入,跨域资源共享自动应答等功能。在小规模,项目上可以有效降低开发工作量。
jetweb
仅适用于开发web
后端程序,因为jetweb
对接口的请求,返回格式做出了限定,以此追求便捷的自动映射功能。
jetweb
使用单一的服务器对象混合支持http
,https
和websocket
。
推荐使用npm
包管理工具安装jetweb
npm install jetweb
以下typescript
源码展示了如何轻松建立一个web服务器
import {Web} from 'jetweb'
const web = new Web({
User: {
getSayHi() {
return 'Hello world!'
}
}
})
web.listen()
运行这份源码,您就可以使用浏览器访问http://localhost:5000/user/say/hi
地址查看到效果了。
jetweb
的使用流程如下:
- 使用
Web
类构造web服务器 - 调用
Web
实例的listen
方法
仅此而已,Web
类的构造方法接受一个Application
对象,内部的每个属性都会被认做一个Controller
。
Controller
的每个方法都会被认做一个Handler
。
Handler
可分为RequestHandler
和WebsocketHandler
两种,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: / */}
}
}
若RequestHandler
声明了参数,jetweb
会在查询请求
中寻找名称相同的字段,注入到参数中。
若请求头包含ContentType: application/json
,则jetweb
会试图解析请求体;若请求体被解析为object
,则其中的属性也会被注入到参数中。
请注意:jetweb
没办法为请求参数检查数据类型。
您在RequestHandler
返回的除了undefined
外的任何内容,都会被json编码后作为响应体发送。
当jetweb
运行RequestHandler
时,一个RequestContext
对象会被注入this
引用。您可以通过this.response
访问响应对象,以手动指定更多细节。
当jetweb
运行RequestHandler
时,一个RequestContext
对象会被注入this
引用。您可以通过this.request
访问请求对象,以获悉更多关于请求的信息。
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
连接使用同一个服务容器,再根据路径手动分配事件。
jetweb
服务器的构造方法还可以接受第二个参数,用于指定自定义的服务器选项。
服务器选项是一个ServerOptions
对象,每一条选项都是其中的一个属性,所有的选项都是可选的。
jetweb
服务器默认监听5000
端口,您可以使用如下代码指定jetweb
服务器监听80
端口。
new Web(app,{port:80})
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 */
}
}
})
默认情况下,jetweb
会在每次请求到来时,拆解请求路径,然后与Controller
对象中的Handler
匹配。这个设计为Controller
保留了动态变化的可能性,但是降低了性能。
您可以指定static
选项为true
,jetweb
将会在Web
对象建立之初构造并启用一个一对一的静态映射表,提高运行效率。
new Web(app, {static: true})
默认情况下,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
。
您可以使用http
选项为http
服务器指定更多选项,默认情况下此选项是空的。
import {Web} from 'jetweb'
let web = new Web(app, {
http:{
...
}
})