Почему промежуточное ПО "koa-static" продолжает возвращать 404?

Я пробую Коа с помощью коа-статики. Но он продолжает возвращаться 404 (Body: Not Found) при использовании многоуровневых отношений включения. Я не знаю причину.

Воспроизвести,

Windows 10 x64, Node v9.11.1

Koa v2.5.1, koa-compose v4.1.0, koa-static v4.0.3, koa-send v4.1.3

Справочник:

index.html index.js sites / sites.js sites / onesite / index.js

Код

index.html

Hello, koa

index.js

const Koa = require('koa')
const router = require('./sites/sites.js')
const app = new Koa()
app.use(router())
app.listen(80)

сайты / sites.js

const compose = require('koa-compose')

module.exports = ()=>{
    return (ctx, next)=>{
        compose(require('./onesite').middleware)(ctx, next)
    }
}

сайты / onesite / index.js

const Koa = require('koa')
const serve = require('koa-static')

const app = new Koa()
app.use(serve('.'))
module.exports = app

Я не говорящий по-английски, пожалуйста, прости меня за синтаксическую ошибку.

Заранее спасибо!

1 ответ

Решение

Ваша проблема в роутере, с которого вы возвращаетесь sites.js:

module.exports = ()=>{
  return (ctx, next)=>{
    compose(require('./onesite').middleware)(ctx, next)
  }
}

compose является асинхронной функцией, но вы не ждете, пока ее обещание завершится. Один из способов решить эту проблему - вернуть обещание, возвращенное compose чтобы koa знает, что нужно дождаться выполнения этого обещания:

module.exports = ()=>{
  return (ctx, next)=>{
    return compose(require('./onesite').middleware)(ctx, next)
  }
}

Другой способ будет использовать await:

module.exports = ()=>{
  return async (ctx, next)=>{
    await compose(require('./onesite').middleware)(ctx, next)
  }
}
Другие вопросы по тегам