让我们尝试使用 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