2016-03-30 8 views
2

私はswagger project createを使ってノードサービスのAPIを立ち上げました。私はthese instructionsを続けた。私もswagger-uiを提供するためにswagger-toolsを使用しています。swagger-uiのベースパスを変更してください

私は、APIのbasePathとそのドキュメントを '/'と '/ docs'からroutingPathとroutingPath + '/ docs'に動的に変更したいと考えています。

swagger API仕様のbasePathを変更できますが、swagger-uiのbasePathを変更する方法がわかりません。私のコードは次のようになります。

'use strict'; 

const defaultRoutingPath = '/api/collection'; 
const defaultPort = 3000; 

var path = require('path'); 
var SwaggerExpress = require('swagger-express-mw'); 
var SwaggerUi = require('swagger-tools/middleware/swagger-ui'); 
var app = require('express')(); 
module.exports = app; // for testing 

var routingPath = process.env.ROUTING_PATH || defaultRoutingPath; 

var config = { 
    appRoot: __dirname // required config 
}; 

SwaggerExpress.create(config, function(err, swaggerExpress) { 
    if (err) { throw err; } 

    swaggerExpress.runner.swagger.basePath = routingPath; // this works 

    app.get('/', (req, res) => { 
    res.redirect(path.join(routingPath, 'docs')); 
    }) 

    // enable SwaggerUI 
    app.use(swaggerExpress.runner.swaggerTools.swaggerUi({ 
    basePath: routingPath // this has no effect 
    })); 

    // install middleware 
    swaggerExpress.register(app); 

    var port = process.env.PORT || defaultPort; 
    app.listen(port); 

    if (swaggerExpress.runner.swagger.paths['/hello']) { 
    console.log('try this:\ncurl http://127.0.0.1:' + port + path.join(routingPath, '/hello?name=Scott')); 
    } 
}); 

私はこのサービスを実行する場合、私は http://localhost:3000/api/collection

で私のAPI仕様を見つけ、 http://localhost:3000/docs

で私のドキュメントのページに、私はドキュメントを提供したいと思いますページの http://localhost:3000/api/collection/docs

私は、swaggerUiコンストラクタにbasePathオプションを渡して、これを実行しようとしました。

// enable SwaggerUI 
    app.use(swaggerExpress.runner.swaggerTools.swaggerUi({ 
    basePath: routingPath // this has no effect 
    })); 

これは機能しませんでした。誰でもswagger-uiのbasePathを設定する方法を知っていますか?

答えて

1

私の質問に対する答えは本質的にthis guidanceの次になりました。

キーは、2番目のエクスプレスアプリ(サブパス)を追加し、メインアプリからroutingPathを使用することでした。ここにコードがあります。

'use strict'; 

const defaultRoutingPath = '/api/collection'; 
const defaultPort = 80; 

var path = require('path'); 
var SwaggerExpress = require('swagger-express-mw'); 
var SwaggerUi = require('swagger-tools/middleware/swagger-ui'); 
var express = require('express'); 
var app = express(); 
var subpath = express(); 
module.exports = app; // for testing 

var routingPath = process.env.ROUTING_PATH || defaultRoutingPath; 

var config = { 
    appRoot: __dirname, // required config 
}; 

SwaggerExpress.create(config, function(err, swaggerExpress) { 
    if (err) { throw err; } 

    app.use(routingPath, subpath); 

    app.get('/', (req, res) => { 
    res.redirect(path.join(routingPath, 'docs')); 
    }) 

    swaggerExpress.runner.swagger.basePath = routingPath; 

    // enable SwaggerUI 
    subpath.use(swaggerExpress.runner.swaggerTools.swaggerUi()); 

    // install middleware 
    swaggerExpress.register(app); 

    var port = process.env.PORT || defaultPort; 
    app.listen(port); 

    if (swaggerExpress.runner.swagger.paths['/health']) { 
    console.log('try this:\ncurl http://127.0.0.1:' + port + path.join(routingPath, '/health')); 
    } 
}); 

今私のドキュメントがここに用意されています http://localhost:3000/api/collection/docs/

0

春ブートを使用して、私は

public class CustomResourceMapping extends WebMvcConfigurerAdapter { 
    @Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
     registry.addRedirectViewController(
     "/configuration/ui", 
     "/swagger-resources/configuration/ui"); 
     registry.addRedirectViewController(
     "/configuration/security", 
     "/swagger-resources/configuration/security"); 
    } 
} 

を再マップできますが、まだ問題を抱えている、ドキュメントの一部が生成され、 その後、 javascriptバグが発生しています:

Navigated to http://localhost:8080/swagger-ui.html jquery-1.8.0.min.js:2 
XHR finished loading: GET "http://localhost:8080/configuration/ui".     jquery-1.8.0.min.js:2 
XHR finished loading: GET "http://localhost:8080/swagger-resources".    jquery-1.8.0.min.js:2 
XHR finished loading: GET "http://localhost:8080/v2/api-docs".      swagger-ui.min.js:10 
swagger-ui.min.js:1 Uncaught TypeError: Cannot read property 'type' of undefined swagger-ui.min.js:1 
    at Object.<anonymous> (swagger-ui.min.js:1) 
    at Object.10 (swagger-ui.min.js:2) 
    at Object.f [as inverse] (handlebars-2.0.0.js:27) 
    at Object.<anonymous> (handlebars-2.0.0.js:27) 
    at Object.9 (swagger-ui.min.js:2) 
    at Object.f [as inverse] (handlebars-2.0.0.js:27) 
    at Object.<anonymous> (handlebars-2.0.0.js:27) 
    at Object.main (swagger-ui.min.js:2) 
    at e (handlebars-2.0.0.js:27) 
    at s.render (swagger-ui.min.js:10) 
関連する問題