Sun.js 是一个 JavaScript 全栈 Web 和 ORM 后端框架,基于面向对象设计的全新路由方式。Sun.js 包含 HTTP、ORM、登录鉴权,微信支付,配置、日志、JWT、静态资源文件服务器等模块,可以快速开发,让程序员只专注业务。Sun.js 基于Bun.js 和 PostgreSQL 开发。
Sun.js is a comprehensive JavaScript full-stack web and ORM backend framework. It features a new routing method based on object-oriented design. Sun.js includes HTTP, ORM, configuration, logging, JWT, and static resource file server modules, enabling rapid development and allowing developers to focus solely on business logic. Sun.js is built on top of Bun.js and PostgreSQL.
curl -fsSL https://bun.sh/install | bash
powershell -c "irm bun.sh/install.ps1 | iex"
bun add bun-sun
新建api文件,api目录下建users.ts,然后创建users类,创建任意属性,任意方法,返回hello+名称
或者拉去git 代码
git clone https://github.com/CodeEasyDev/sun.git 然后 bun install
export class users {
name: string
async test() {
return `hello world`
}
}
index.ts中导入run(),
import {run} from "bun-sun";
run()
bun run index.ts
然后调用get http://localhost:3000/users/test
"hello 张三"
可以看到接口返回了"hello 张三", 我们创建了一个类,然后什么都不用管,请求/users/get代表调用user对象的get方法,user.get(), 用面向对象的思想,巧妙的自动将路由转换成对象方法,users类有get,add方法,路径就为/users/get,/users/add
请求方式: /user/get,/user.get, /user 三选一,http://localhost:3000/get,/users.get,/users/get
export class users {
name: string
async get() {//访问GET /users 前端收到"查询用户接口"
return `查询用户接口` /users
}
async del() {//访问DELETE /users 前端收到"删除用户接口"
return `删除用户接口` / users
}
async login() {//访问GET /users/login 前端收到"hello world"
return `login method`
}
}
export class users {
name: string
async get(req) {//参数自动映射到this.name和req.name,二选一
return `hello ${this.name},${req.name}` //前端收到"hello 张三"
}
}
export class users {
name: string
async get(name) {//这里指定name,张三自动映射到name,或者自动映射this.name上
return `hello ${this.name}` //前端收到"hello 张三"
}
}
export class users {
name: string
age:number
async post(req) {//json参数自动映射到req和this上面
return `hello ${this.name},${this.age}` //前端收到"hello 张三,18"
}
}
conf.toml配置postgres数据库的连接
[db]
dsn='postgres://postgres:root@localhost:5432/mydb'
继承base类自动拥有增删改查方法,post,del,put,get
export class users extends base{
name: string
age:number
async get() {//访问 /users 前端自动获取数据库数据
return await super.get() //等效select * from users
}
}
export class users extends base{
name: string
age:number
async testAdd(req) {//json自动绑定到this和req对象,二选一
return await super.post() //等效super.post(req)
}
}
export class users extends base{
name: string
age:number
async testAdd(list) {//json list自动绑定到this.list和list上,二选一
return await super.post() //等效super.post(list)
}
}
export class users extends base{
name: string
age:number
async testDel(name) {//json自动绑定到this.name和name,二选一
return await super.del() //super.del(name)等效,delete from users where name='张三'
}
}
export class users extends base{
name: string
age:number
async testDel(where) {//根据参数个数自动动态删除
return await super.del() //super.del(where)等效,delete from users where id=1 and name=张三
}
}
这里涉及query sql,代表sql的条件,和sql写法一模一样,但是and or显得臃肿可以替换成&和|
export class users extends base{
name: string
age:number
async testDel(where) {//json自动绑定到this和req对象,二选一
return await super.del(where) //delete from users where id<100 or name=张三
}
}
export class users extends base{
name: string
age:number
async testPut(req) {//json自动绑定到this和req对象,二选一
return await super.post() //等效super.post(req)
}
}
export class users extends base{
name: string
age:number
async testPut(where) {//根据参数个数自动动态修改
return await super.put(where) //update users set pwd='1111',age=18 where id=1 and name='张三'
}
}
这里涉及query sql,代表sql的条件,和sql写法一模一样,但是and or显得臃肿可以替换成&和|
export class users extends base{
name: string
age:number
async testPut(where) {//json自动绑定到this和req对象,二选一
return await super.put(where) //update users set pwd='1111',age=18 where id<100 or name=张三
}
}
export class users extends base{
name: string
age:number
async testDel(id) {//json自动绑定到this.name和name,二选一
return await super.get() //super.get(id)等效,select * from users where name='张三'
}
}
export class users extends base{
name: string
age:number
async testDel(where) {//根据参数个数自动动态查询
return await super.get() //super.get(where)等效,select * from users where id=1 and name=张三
}
}
这里涉及query sql,代表sql的条件,和sql写法一模一样,但是and or显得臃肿可以替换成&和|
export class users extends base{
name: string
age:number
async testGet(where) {
return await super.get(where) //select * from users where id<100 or name=张三
}
}
前端直接通过数据api操作数据库,实现敏捷开发
export class users extends base{ //继承base不需要写任何方法,前端直接调用get,post,del,update
name: string
age:number
}
路径:POST /users 或者POST /users/post json:{"name":"张三","age":18},教程和上述orm一样,
路径:DELETE /users?id<100|name=张三, 或者POST /users/del?id<100|name=张三 ,教程和上述orm一样,
路径:PUT /users?id<100|name=张三 ,或者 POST /users/put?id<100|name=张三 json:{"pwd":"1111","age":18},教程和上述orm一样,
路径:/users?id<100|name=张三, 或者/users/get?id<100|name=张三 ,教程和上述orm一样
继承base,在user类里写方法,user是controller层,user的父类是dao层
export class users extends base{
name: string
async login() {//子类是controller层,处理登录的复杂逻辑,如参数校验,密码正确校验,生成jwtToken
if (!this.name||!this.pwd) throw "用户名或密码错误"
await super.get()//父类是dao层super.get() 是父类dao层再操作数据库,查询失败会抛异常直接返回Not Found错误,因此不需要判断查询成功
let jwtToken=await jwtToken({uid:this.id})//查询失败自动给前端返回Not Found,成功自动赋值到this,生成jwt
return {uid:this.id,token:jwtToken} //给前端返回token,双层架构完成了复杂的逻辑处理,完成了登录功能
}
}
查询接口,/users/get,或GET /users/id, 查询id为3用户,查列表get变为gets即可
{
"id": 3,
}