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:{
...
}
})