設定
- OpenAPIでAPI仕様書を書く
- API仕様書からswagger-api/swagger-codegenを使って、Node.jsのServer stubを生成する
API仕様書からNode.jsのServer stubの生成
API仕様書の一部抜粋
'/groups/{groupid}/users/{userid}':
put:
tags:
- groupUser
operationId: put-groups-groupId-users-userId
parameters:
- name: groupId
in: path
schema:
type: string
default: sampleGroupId
- name: userId
in: path
schema:
type: string
default: sampleUserId
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/GroupUser'
x-swagger-router-controller: GroupUser
生成されたNode.jsのstub
上記のyamlファイルからは以下のようなcontrollerが生成される。
関数名はoperationId
をキャメルケースに変換した名前になる。
module.exports.putGroupsGroupIdUsersUserId = function putGroupsGroupIdUsersUserId (req, res, next, groupId, userId) {
GroupUser.putGroupsGroupIdUsersUserId(groupId, userId)
.then(function (response) {
utils.writeJson(res, response);
})
.catch(function (response) {
utils.writeJson(res, response);
});
};
ルーティングも生成される。
ルーティングは以下のように、bug-hunters/oas3-toolsによって、API仕様書を用いて行うことができる。
'use strict';
var path = require('path');
var http = require('http');
var oas3Tools = require('oas3-tools');
var serverPort = 8080;
// swaggerRouter configuration
var options = {
routing: {
controllers: path.join(__dirname, './controllers')
},
};
var expressAppConfig = oas3Tools.expressAppConfig(path.join(__dirname, 'api/openapi.yaml'), options);
var app = expressAppConfig.getApp();
// Initialize the Swagger middleware
http.createServer(app).listen(serverPort, function () {
console.log('Your server is listening on port %d (http://localhost:%d)', serverPort, serverPort);
console.log('Swagger-ui is available on http://localhost:%d/docs', serverPort);
});
問題
しかし、/groups/{groupid}/users/{userid}
へのリクエストが処理されない
原因
ルーティングはbug-hunters/oas3-toolsを用いて行われる。
oas3-toolsは、API仕様書を読み込み、operationId
をキャメルケースに変換して、ルーティングする。
operationId: put-groups-groupId-users-userId
なので、キャメルケースに変換すると、putGroupsGroupidUsersUserid
になる
しかし、関数名はputGroupsGroupIdUsersUserId
である。
解決
operationId: put-groups-groupId-users-userId
ではなく、正しいケバブケースである、operationId: put-groups-groupid-users-userid
にするべきだった。