Swagger 工具生产构建节点 js
Swagger Tools Production Build Node js
我们在 nodeJs 应用程序中实现了 swagger。截至目前,我们使用 webpack 创建了生产构建并删除了控制器和服务文件。
bin/www.js
const YAML = require('yamljs');
const swaggerTools = require('swagger-tools');
const swaggerDoc = YAML.safeLoad('./swagger.yaml');
// swaggerRouter configuration
const swaggerOptions = {
controllers: path.join(__dirname, '../public/javascripts/controllers'),
useStubs: true, // Conditionally turn on stubs (mock mode)
};
// Initialize the Swagger middleware
swaggerTools.initializeMiddleware(swaggerDoc, (middleware) => {
// Interpret Swagger resources and attach metadata to request - must be first in swagger-tools middleware chain
app.use(middleware.swaggerMetadata());
// validate the security using JWT token
app.use(middleware.swaggerSecurity({
Bearer: auth.verifyToken
}));
// Validate Swagger requests
app.use(middleware.swaggerValidator({
validateResponse: true
}));
// Route validated requests to appropriate controller
app.use(middleware.swaggerRouter(swaggerOptions));
// Serve the Swagger documents and Swagger UI
app.use(middleware.swaggerUi());
});
如果我们在生产构建中做同样的事情,并且 swagger 中间件期望相同的路径来解析。构建后我们删除 public 文件夹。
Webpack代码
const path = require('path');
const nodeExternals = require('webpack-node-externals');
module.exports = {
entry: {
server: './bin/www',
},
output: {
path: path.join(__dirname, 'dist'),
publicPath: '/',
filename: 'server.build.js',
},
target: 'node',
node: {
// Need this when working with express, otherwise the build fails
__dirname: false, // if you don't put this is, __dirname
__filename: false, // and __filename return blank or /
},
externals: [nodeExternals()],
module: {
rules: [
{
// Transpiles ES6-8 into ES5
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
},
},
],
},
};
请帮助我们使用 swagger 中间件创建构建
提前致谢
Swagger 工具不像 webpack 那样是打包工具。所以你仍然需要向它提供控制器文件。由于您要从 prod 中删除 /public ,因此 swagger 工具中间件无法获取所需的文件。在这种情况下,Webpack 基本上是从您的代码中构建一个 dist,这就是为什么可以删除控制器和服务的原因。
我们在 nodeJs 应用程序中实现了 swagger。截至目前,我们使用 webpack 创建了生产构建并删除了控制器和服务文件。
bin/www.js
const YAML = require('yamljs');
const swaggerTools = require('swagger-tools');
const swaggerDoc = YAML.safeLoad('./swagger.yaml');
// swaggerRouter configuration
const swaggerOptions = {
controllers: path.join(__dirname, '../public/javascripts/controllers'),
useStubs: true, // Conditionally turn on stubs (mock mode)
};
// Initialize the Swagger middleware
swaggerTools.initializeMiddleware(swaggerDoc, (middleware) => {
// Interpret Swagger resources and attach metadata to request - must be first in swagger-tools middleware chain
app.use(middleware.swaggerMetadata());
// validate the security using JWT token
app.use(middleware.swaggerSecurity({
Bearer: auth.verifyToken
}));
// Validate Swagger requests
app.use(middleware.swaggerValidator({
validateResponse: true
}));
// Route validated requests to appropriate controller
app.use(middleware.swaggerRouter(swaggerOptions));
// Serve the Swagger documents and Swagger UI
app.use(middleware.swaggerUi());
});
如果我们在生产构建中做同样的事情,并且 swagger 中间件期望相同的路径来解析。构建后我们删除 public 文件夹。
Webpack代码
const path = require('path');
const nodeExternals = require('webpack-node-externals');
module.exports = {
entry: {
server: './bin/www',
},
output: {
path: path.join(__dirname, 'dist'),
publicPath: '/',
filename: 'server.build.js',
},
target: 'node',
node: {
// Need this when working with express, otherwise the build fails
__dirname: false, // if you don't put this is, __dirname
__filename: false, // and __filename return blank or /
},
externals: [nodeExternals()],
module: {
rules: [
{
// Transpiles ES6-8 into ES5
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
},
},
],
},
};
请帮助我们使用 swagger 中间件创建构建
提前致谢
Swagger 工具不像 webpack 那样是打包工具。所以你仍然需要向它提供控制器文件。由于您要从 prod 中删除 /public ,因此 swagger 工具中间件无法获取所需的文件。在这种情况下,Webpack 基本上是从您的代码中构建一个 dist,这就是为什么可以删除控制器和服务的原因。