此文章是我自己用来记录如何搭建一个以express为基础的api服务器框架的过程,并不是什么新手教程,并不会每一步都写得非常详细,如果您要阅读此文,需要一点nodejs和编写代码的基础知识
现在开发网站或者app,都开始使用前后端分离的模式进行,前端专注展示,后端处理数据.后端的开发只关心处理请求和发送数据,并不需关心页面展示
使用express搭建一个api服务器,处理http请求
建立一个新项目
从0开始,创建一个新的nodejs项目
此部分参考之前的文章 链接: 记录使用npm创建一个全新的nodejs项目
https://blog.csdn.net/goodboy31985/article/details/106197587
项目取名api-framework-express
在github上创建此项目
另外,我在github上也建立这个项目,方便进行代码的管理和版本管理
先确保在你的机器上正确安装了git,从官网链接: https://git-scm.com/.下载并安装自己的系统相对应的版本即可
-
在github中建立项目
这里我们不需要生成README文件,我们等下直接在本地建立 -
在自己的项目中运行代码,提交项目文件到git服务器
根据这里的代码提示,直接在自己的项目中运行这些代码
如果出现了这个错误,是因为还未登录你的github
运行这两行命令
git config --global user.email “you@example.com”
git config --global user.name “Your Name”
填写你的git账号的邮箱和用户名
然后点击这里的提交按钮
再次运行 git push -u origin master 命令,系统一般会尝试让你登录github,登录成功就可以正确得push项目了
此时刷新你的github上的项目页面,里面应该已经有了我们提交的文件
此时可以继续参考之前的文章,进行typescript 和 断点调试等功能的设置
在项目文件夹中新建一个 .gitignore 文件(注意不要漏掉前面的点),这个文件可以定义哪些文件不必上传到git,因为比如运行时产生的临时文件是不需要上传git的,内容可以如下
# Visual Studio Code
#
.vscode/
# node.js
#
dist/
node_modules/
logs/
cache/
这个文件中列出的文件或者文件夹,将被git忽略
最后再提交一次git
我们有了一个空项目,我们就在这个空项目上,开始搭建服务框架
搭建项目框架
安装express包,先运行一个最基础的服务器程序
- 使用yarn包管理器,下载express,并开启一个服务器
使用命令 npm install express 在项目中引入express包
安装成功后,在package.json中会出现此依赖
此外,由于此项目使用TypeScript编写,有一些包会缺少类型声明文件,此时,就需要引入此包一个对应的类型定义包,比如express 就有对应的 @types/express 我们也需要安装
通过命令 npm install --dev @types/express 进行安装
安装完成后,在package.json中会出来一个开发依赖包,这些包只在开发阶段有用,项目正式运行的时候,这些包并不是必要的. - 编写代码,让服务器代码运行起来
将此功能包装成一个类,新建一个ApiServer.ts的文件,实现服务器的初始化和运行功能
ApiServer.ts
//ApiServer.ts
import express, { Application } from "express"
export class ApiServer
{
//单例
private static instance: ApiServer = null;
private constructor()
{
}
public static GetInstance()
{
if (ApiServer.instance==null) {
ApiServer.instance = new ApiServer();
}
return ApiServer.instance;
}
//此类的核心成员
private app: Application = null;
//初始化
Init()
{
this.app = express();
let server = this.app.listen(50000, () => {console.info("Example app listening on port 50000")})
//让express 能够处理 async/await 中抛出的异常
const layer = require('express/lib/router/layer');
Object.defineProperty(layer.prototype, 'handle', {
enumerable: true,
get()
{
return this.__handle;
},
set(fn)
{
if (fn.length === 4)
{
this.__handle = fn;
}
else
{
this.__handle = (req, res, next) =>
{
Promise.resolve(fn(req, res, next)).catch(next);
}
}
}
});
}
Run()
{
//测试消息
this.StartTestResponse();
//public文件夹下的静态资源,可以直接进行访问
this.app.use(express.static('public'))
}
//测试消息
StartTestResponse()
{
this.app.all('/api/test', (req, res) =>
{
res.writeHead(200, {
'Content-Type': 'text-plain'
});
res.end('Hello World\n' + new Date().toString());
})
}
}
app.ts 作为整个项目的入口,在此文件中,调用ApiServer,开启服务器
//app.ts
import { ApiServer } from "./ApiServer";
async function main()
{
ApiServer.GetInstance().Init();
await ApiServer.GetInstance().Run();
}
main();
在之前的文章中,已经设置好调试代码,会以app.ts 作为程序入口
这时运行程序进行调试,发现服务器已经成功运行在本机的50000端口上(如果遇到防火墙拦截,注意允许通过)
在浏览器中输入本机地址和端口,测试下我们在ApiServer中测试api /api/test
已经成功输出了hello world 和服务器的时间
至此,一个最简单的服务器已经上线,可以为我们提供查询时间的功能
以后的文章中 会慢慢得在此基础上不断修改和完善各个模块和功能