记录nodejs使用express搭建一个服务器程序,对外提供api,处理http请求(1)

此文章是我自己用来记录如何搭建一个以express为基础的api服务器框架的过程,并不是什么新手教程,并不会每一步都写得非常详细,如果您要阅读此文,需要一点nodejs和编写代码的基础知识

建立一个新项目

从0开始,创建一个新的nodejs项目

此部分参考之前的文章 链接: 记录使用npm创建一个全新的nodejs项目
https://blog.csdn.net/goodboy31985/article/details/106197587
项目取名api-framework-express

在github上创建此项目

另外,我在github上也建立这个项目,方便进行代码的管理和版本管理
先确保在你的机器上正确安装了git,从官网链接: https://git-scm.com/.下载并安装自己的系统相对应的版本即可
在这里插入图片描述

  1. 在github中建立项目
    在这里插入图片描述
    在这里插入图片描述
    这里我们不需要生成README文件,我们等下直接在本地建立

  2. 在自己的项目中运行代码,提交项目文件到git服务器
    根据这里的代码提示,直接在自己的项目中运行这些代码
    在这里插入图片描述
    在这里插入图片描述
    如果出现了这个错误,是因为还未登录你的github
    在这里插入图片描述
    运行这两行命令
    git config --global user.email “[email protected]
    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包,先运行一个最基础的服务器程序

  1. 使用yarn包管理器,下载express,并开启一个服务器
    使用命令 npm install express 在项目中引入express包
    安装成功后,在package.json中会出现此依赖
    在这里插入图片描述
    此外,由于此项目使用TypeScript编写,有一些包会缺少类型声明文件,此时,就需要引入此包一个对应的类型定义包,比如express 就有对应的 @types/express 我们也需要安装
    通过命令 npm install --dev @types/express 进行安装
    在这里插入图片描述
    安装完成后,在package.json中会出来一个开发依赖包,这些包只在开发阶段有用,项目正式运行的时候,这些包并不是必要的.
  2. 编写代码,让服务器代码运行起来
    将此功能包装成一个类,新建一个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 和服务器的时间
至此,一个最简单的服务器已经上线,可以为我们提供查询时间的功能

以后的文章中 会慢慢得在此基础上不断修改和完善各个模块和功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章