Robert Hovhannisyan
Robert Hovhannisyan

Reputation: 3343

Koa - TypeError: Middleware stack must be an array

I have router created with koa-router:

auth.js

const KoaRouter = require('koa-router');

const { signIn, signUp } = require('../controllers/auth');

const authRouter = new KoaRouter();

authRouter.post('/signin', signIn).post('/signup', signUp);

module.exports = authRouter;

And I want to use it as middleware in my main app. In express, I can just write app.use(authRouter). But Koa said that the middleware should be a function. I find a solution for that and used koa-mount package to solve that problem like this app.use(mount(authRouter)). But now it gives this error:

if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!') ^

TypeError: Middleware stack must be an array!

But when I log the authRouter the stack property is array of routes:

Router {
  opts: {},
  methods:
   [ 'HEAD', 'OPTIONS', 'GET', 'PUT', 'PATCH', 'POST', 'DELETE' ],
  params: {},
  stack:
   [ Layer {
       opts: [Object],
       name: null,
       methods: [Array],
       paramNames: [],
       stack: [Array],
       path: '/signin',
       regexp: /^\/signin[\/#\?]?$/i },
     Layer {
       opts: [Object],
       name: null,
       methods: [Array],
       paramNames: [],
       stack: [Array],
       path: '/signup',
       regexp: /^\/signup[\/#\?]?$/i } ] }

Here is the whole code:

const Koa = require('koa');
const KoaRouter = require('koa-router');
const mount = require('koa-mount');
const bodyParser = require('koa-bodyparser');

const config = require('./config');
const authRoutes = require('./routes/auth');

const app = new Koa();
const router = new KoaRouter();

console.log(authRoutes);
app.use(bodyParser());
app.use(router.routes()).use(router.allowedMethods());
app.use(mount(authRoutes));

app.listen(config.PORT || 3001);

Upvotes: 0

Views: 708

Answers (1)

timothyclifford
timothyclifford

Reputation: 6969

I think you're just missing calling .routes() on your authRoutes object.

const Koa = require('koa');
const KoaRouter = require('koa-router');
const mount = require('koa-mount');
const bodyParser = require('koa-bodyparser');

const config = require('./config');
const authRoutes = require('./routes/auth');

const app = new Koa();
const router = new KoaRouter();

console.log(authRoutes);
app.use(bodyParser());
app.use(router.routes()).use(router.allowedMethods());
// add this line 👇🏼
app.use(authRoutes.routes()).use(authRoutes.allowedMethods());

app.listen(config.PORT || 3001);

Upvotes: 1

Related Questions