让我们尝试使用 Node.js + Express + TypeScript 来创建 REST API

我将总结使用Node.js、Express和Typescript创建REST API的步骤。由于我将包含自己喜欢的信息,您可以根据需要进行删减和自定义。

准备

通过运行 node -v 和 npm -v 命令来确认已安装 Node.js 和 npm。
在进行开发的目录中运行 npm init 来确认 package.json 文件被创建。会有一些问题出现,但是全部都可以直接按下回车键。

需要安装必要的库文件等内容。

安装适用于4系和Typescript的包。

$ npm install express --save
$ npm install helmet --save
$ npm install cors --save
$ npm install mongodb mongoose --save
$ npm install body-parser --save
$ npm install moment --save
$ npm install -D typescript @types/node 
$ npm install -D @types/express @types/helmet @types/cors @types/mongoose
$ npm install -D ts-node

使用npm进行安装。
添加—save选项将被写入到package.json的依赖(dependencies)中。
添加-D选项将被写入到package.json的开发依赖(devDependencies)中。

目录结构

为了关注代码的清晰性,首先我们将构建如下的组织结构。

express-api
 |—- /应用程序
 |   └ app.ts
 |   └ /模型
 |   └ /路由
 |   └ /服务
 |   
 |—- package.json

app.ts 执行此文件将启动服务器
/models 数据库模型信息
/routes 接口的路由分配
/services 服务的处理
package.json 包管理

注目了,它是時間使用的跨平台開發技術。

npx tsc –init でtsconfig.jsonファイルを作成します。
tsconfig.jsonのtargetがes5だった場合、es6に変更します。

コードを書く

你好,世界。

首先,在app.ts中写下以下内容,确保返回”hello world”。

// ライブラリ読み込み
import express from 'express';
import helmet from 'helmet';
import cors from 'cors';
const app = express();
app.use(helmet());
app.use(cors());
const bodyParser = require('body-parser');

//body-parserの設定
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

const port = process.env.PORT || 3000; // port番号を指定

app.get('/helloWorld', (req, res) => {
    res.status(200).send({ message: 'hello, world' });
});

//サーバ起動
app.listen(port);
console.log('listen on port ' + port);

运行 npx tsc 命令会进行编译并转换成 js 文件。
使用 node app/app.js 命令运行文件。
确认控制台显示 listen on port 3000 后,打开 postman,发送 GET 请求到 http://localhost:3000/helloWorld。

如果能够收到以下的回应,那就是成功了!

{
  "message": "Hello, world"
}

使用ts-node命令可以自动执行tsc -> node,提高开发效率。尝试执行npx ts-node app/app.ts。

有一个名为ts-node-dev的命令,它可以在检测到源代码更改时自动重新执行,但本次将省略使用它。

以上都可以使用Ctrl + C进行结束。

将API按目录进行分割,使其更加清晰整洁。

首先,将app.ts进行如下修改。

// ライブラリ読み込み
import express from 'express';
import helmet from 'helmet';
import cors from 'cors';
const app = express();
app.use(helmet());
app.use(cors());
const bodyParser = require('body-parser');

//body-parserの設定
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

const port = process.env.PORT || 3000; // port番号を指定

// ------ ルーティング ------ //
const router = require('./routes/');
app.use('/', router);

//サーバ起動
app.listen(port);
console.log('listen on port ' + port);

现在我们已经完成了路由设置,接下来,在routes目录下创建index.ts文件,并按下面的方式进行记录。

import express from 'express';
import helmet from 'helmet';
import cors from 'cors';
const app = express();
app.use(helmet());
app.use(cors());
// ルーティングする
const router = express.Router();

// routerにルーティングの動作を記述する
router.get('/helloWorld', (req, res) => {
    res.status(200).send({ message: 'Hello, world' });
});

// -------------------------------------------------
//  以下、何のルーティングにもマッチしないorエラー
// -------------------------------------------------

// いずれのルーティングにもマッチしない(==NOT FOUND)
app.use((req, res) => {
    res.status(404);
    res.render('error', {
      param: {
        status: 404,
        message: 'not found'
      },
    });
  });

//routerをモジュールとして扱う準備
module.exports = router;

执行ts-node命令,并且通过Postman调用API来确认返回相同的结果。

接下来,让我们进行服务设置。
在routes/index.ts中,添加一个名为test的API。

import express from 'express';
import helmet from 'helmet';
import cors from 'cors';
import { TestService } from '../services/TestService';
const app = express();
app.use(helmet());
app.use(cors());
// ルーティングする
const router = express.Router();

// routerにルーティングの動作を記述する
router.get('/helloWorld', (req, res) => {
    res.status(200).send({ message: 'Hello, world' });
});

router.get('/test', (req, res, next) => {
    const service = new TestService();
    service
      .test()
      .then(result => res.status(200).send(result))
      .catch(next);
});

// -------------------------------------------------
//  以下、何のルーティングにもマッチしないorエラー
// -------------------------------------------------

// いずれのルーティングにもマッチしない(==NOT FOUND)
app.use((req, res) => {
    res.status(404);
    res.render('error', {
      param: {
        status: 404,
        message: 'not found'
      },
    });
});

//routerをモジュールとして扱う準備
module.exports = router;

然后,在services文件夹下创建TestService.ts文件,并按照以下方式进行记录。

//インターフェース
export interface ITest {
  test: string;
}

//クラス
export class TestService {
    public async test(): Promise<ITest> {
        return {
           test: 'test1'
       } 
    }
}

发送一个GET请求到http://localhost:3000/test,并成功接收以下响应!

{
    "test": "test1"
}

接下来,让我们设置数据库和架构。

MongoDB做好准备。

安装mongoDB

通过以下命令安装MongoDB:
brew tap mongodb/brew
brew install mongodb-community

MongoDB的配置文件将会在/usr/local/etc/mongod.conf中创建。
在确认其内容后,会记录保存日志和数据库的路径。

启动MongoDB服务brew services start mongodb-community.

可以使用Mongo命令连接到数据库。

新增数据

使用以下命令创建名为app1db的数据库。
使用 app1db
切换到数据库后,使用以下命令添加数据。

> db.test_user.insert({"user":"user1","email":"user1@gmail.com"})
> db.test_user.insert({"user":"user2","email":"user2@gmail.com"})

通过这个命令,用户信息如user等将以BSON格式保存在名为test_user的集合(类似于关系型数据库的表)中。

在数据库连接的部分添加。

将连接到MongoDB的部分添加到app.ts中。

// mongodb
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
const options = {
    useUnifiedTopology : true,
    useNewUrlParser : true
}
mongoose.connect('mongodb://localhost:27017/app1db', options);
mongoose.connection.on('error', function(err: any) {
    console.error('MongoDB connection error: ' + err);
    process.exit(-1);
});

创建模型文件

在models文件夹中创建TestMongoModel.ts,并进行以下描述。

import mongoose from 'mongoose'; //mongoDBに接続するためのライブラリ
const Schema = mongoose.Schema; //mongoDBのスキーマを作る

const TestMongoSchema = new Schema({
    user :String,
    email: String
},{
    collection: 'test_user'
});

// スキーマをモデルとしてコンパイルし、それをモジュールとして扱えるようにする
module.exports = mongoose.model('TestMongoModel', TestMongoSchema);

我们继续准备从数据库获取数据的新API。在routes/index.ts文件中添加test/mongo/:user路径。

router.get('/test/mongo/:user', (req, res, next) => {
    const { user } = req.params;
    const service = new TestMongoService();

    service
      .run(user)
      .then(result => res.status(200).send(result))
      .catch(next);
});

进一步在services文件夹下创建TestMongoService.ts,并写入以下内容。

//インターフェース
export interface ITest {
  user: string;
  email: string;
}

//クラス
export class TestMongoService {
    public async run(params: any): Promise<ITest> {
      const testAll = await TestMongoModel.find();  
      return testAll;
    }
}

如果能够使用路径参数,这样就可以做到一切了。使用postman打开http://localhost:3000/test/mongo/alluser并确认能看到以下内容显示,那就算成功了!

[
    {
        "_id": "5f12ec4732c83a71dcf0e7db",
        "user": "user1",
        "email": "user1@gmail.com"
    },
    {
        "_id": "5f12ec5532c83a71dcf0e7dc",
        "user": "user2",
        "email": "user2@gmail.com"
    }
]

请提供相关资料

以下是需要完全用中文表述的重新写作版本:
– 链接1:https://qiita.com/drafts/73cc7160d002a4989416/edit
– 链接2:https://qiita.com/notakaos/items/3bbd2293e2ff286d9f49

bannerAds