最近开始为nodejs express app探索swagger。 据我所知,swagger是一种框架,需要在nodejs express app中遵循约定。 Swagger通过控制器自动映射路径。
但我觉得,我没有注入像护照这样的中间件进行身份验证的功能,可以很容易地在用户定义的路由中添加。
我知道有很多方法可以轻率地注入中间件,但不知怎的,我觉得它并不像没有招摇的那样自然。
我的代码中是否有一种方法可以使用swagger和最小的swagger相关组件 - 可能仅使用swagger.yaml文件?
我想避免使用req.swagger.param类代码,并希望利用标准方法来定义路由和注入中间件。
答案 0 :(得分:5)
Swagger本身就是一个中间件。当您启动应用程序时,swagger将使用app.Use([swaggerMiddlewareObject])注册自己。所以你可以在swagger之前/之后添加其他middlware。
请在下面找到评论部分。您必须根据您的身份验证策略进行更改。
'use strict';
var SwaggerExpress = require('swagger-express-mw');
var app = require('express')();
var passport = require('passport');
module.exports = app; // for testing
var config = {
appRoot: __dirname // required config
};
/*Mount your passport Middleware here using app object. As your are building a stateless restful api, I assume you would use jwt
* 1. import jwt-strategy.
* 2. Configure passport to use jwt strategy.
* 3. app.use(passport.initialize());
* 4. app.use('/pathYouWantProtect', passport.authenticate('jwt-strategy'),function(req,res,next){
*
* });
*/
SwaggerExpress.create(config, function(err, swaggerExpress) {
if (err) { throw err; }
// install middleware
swaggerExpress.register(app);
var port = process.env.PORT || 10010;
app.listen(port);
if (swaggerExpress.runner.swagger.paths['/hello']) {
console.log('try this:\ncurl http://127.0.0.1:' + port + '/hello?name=Scott');
}
});
答案 1 :(得分:0)
我的解决方案。需要定义一个中间件
./middleware/passport
export.swaggerPassport = function(passport) {
const applyPassport = passportService(passport);
return function(controller) {
const action = async (req, res, next) => {
const [err, user] = await applyPassport(req, res, next);
if (err) {
return errorResponse(res, err, 422);
}
controller.action(req, res, next);
};
return { spec: controller.spec, action };
}
};
../services/util.service
exports.swaggerPassport = function(passport) {
const applyPassport = passportService(passport);
return function(controller) {
const action = async (req, res, next) => {
const [err, user] = await applyPassport(req, res, next);
if (err) {
return errorResponse(res, err, 422);
}
controller.action(req, res, next);
};
return { spec: controller.spec, action };
}
};
然后通过那里护照
server.js
const { passportStrategy, swaggerPassport } = require('./middleware/passport');
passportStrategy(passport);
const routePassport = swaggerPassport(passport);
并在需要保护控制器动作时致电
swagger.addGet(routePassport(api.Dashboard.dashboard))
github中所有可用的代码