【问题标题】:Why can't I serve static files from a Koa router?为什么我不能从 Koa 路由器提供静态文件?
【发布时间】:2019-06-14 14:13:36
【问题描述】:

为什么在以下情况下koa-static 无法与koa-router 一起使用?

const Koa = require("koa")
const serve = require("koa-static")
const Router = require("koa-router")

const app = new Koa()
const router = new Router()

// fails with 404... why?
router.use(serve("public"))

// // this, on the other hand, works
// app.use(serve("public"))

app.use(router.middleware())
app.listen(8080)

// browse to "http://localhost:8080/testfile.txt"

我创建了这个 GitHub 代码库来演示这个问题:koa-router-static-issue

【问题讨论】:

  • 尝试添加 "./" -> router.use(serve("./dist/clientside"))
  • @VadimHulevich — 不幸的是,我发现添加 ./ 前缀没有任何影响
  • 你能显示你的 404 错误吗?
  • @Sparw — 浏览器显示文本 Not Found — 另外,我创建了这个 git repo 作为一个简单的沙箱来演示问题

标签: javascript node.js koa koa-router koa-static


【解决方案1】:

这基本上就是我们在应用中配置内容的方式。

它使用koa-mount 将静态文件服务器挂载到特定的根 URL。如果您的静态文件 URL 与路由的命名空间重叠,则静态文件胜出。

const Koa    = require('koa')
const Router = require('koa-router')
const serve  = require('koa-static')
const mount  = require('koa-mount')

const app    = new Koa()
const router = new Router()

router.get('/public/foobar.txt', (ctx,next) => {

  ctx.body   = "Ta-Da!"
  ctx.status = 200

  return;
})

app.use( mount( '/public', serve('./public') ) ) ;
app.use( router.middleware())

app.listen( 8080 ) ;

【讨论】:

  • 尼古拉斯,这对于静态路径来说很好,但路由器的好处是允许动态路由参数。例如,考虑一个多租户应用程序 -/public/:tenant/:site/:slug* - 因为静态安装到应用程序,而不是路由器中间件,所以不能使用动态路径。想法?
【解决方案2】:

另一种选择是将静态文件夹包装成可以作为路由器后备的方式...

const router = Router();
router.get('/', (ctx) => { ctx.body = 'Hello World!' });
app.use(serve('/tmp'));
app.use(router.routes());

在该示例中,转到 / 将带您到 helloWorld,并回退到 /tmp/ 中的任何文件

来源:https://github.com/ZijianHe/koa-router/issues/446

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2015-09-14
    • 2019-05-07
    • 2017-08-16
    相关资源
    最近更新 更多