如何使用ES6在Koa.js中创建中间件

时间:2017-08-09 14:57:26

标签: node.js middleware koa.js

我是在最近使用Express的背景下首次在Koa.JS中构建应用程序。

我正在使用Babel在运行时转换代码,同时开发给我带来了ES6 +代码的优势。

我在Koa中遇到问题,定义了一个我想要使用的中间件并存储在ctx对象上以便稍后在我的应用程序中使用。我不确定我哪里出错了,因为我可以在Express中做类似的事情(虽然不是在ES6代码中)。

这是我的中间件:

require 'rqrcode_png'
class QrCodeTag < Liquid::Tag
  include Jekyll::LiquidExtensions
  def initialize(tag_name, url, tokens)
    super
    params = Shellwords.shellwords url
    @url = url.strip
  end

  def render(context)
    page_url = Liquid::Template.parse('{{'+@url+'}}').render context

    qr = RQRCode::QRCode.new(page_url, size: 4) # Size increased because URLs can be long
    png = qr.to_img
    png = png.resize(120, 120)
    <<-MARKUP.strip
    <div class="qrcode">
      <a href="#{page_url}" target="_blank"> <img src="#{png.to_data_url}" alt="#{page_url}"> </a>
    </div>
    MARKUP
  end
end

Liquid::Template.register_tag('qr', QrCodeTag)

我的app.js条目文件中我使用中间件的部分:

const Config = require('../../Config');

import jwt from 'jsonwebtoken';

const JWTController = () => {
    return {
        async generateToken(tokenVars) {
            const secretKey = Config.auth.secret;
            const claims = {
                sub: tokenVars.userid,
                iss: Config.auth.issuer,
                account: tokenVars.accountId,
                permissions: ''
            };

            let token = await jwt.sign(claims, secretKey);
            return token;
        },

        async decodeClaims(token) {
            const decodedToken = jwt.decode( token, {complete: true} );
            return decodedToken;
        }
    }
};

export default JWTController;

有人能看出为什么这不起作用吗?

由于

1 个答案:

答案 0 :(得分:2)

将中间件定义更改为

app.use(async (ctx, next) => {
 ctx.JWTController = JWTController;
 await next();

});