为什么我不能从Koa路由器中提供静态文件?

11
为什么在以下情况下,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")) - Vadim Hulevich
@VadimHulevich——不幸的是,我发现添加“./”前缀没有任何影响。 - ChaseMoskal
你能显示你的404错误吗? - Sparw
@Sparw - 浏览器显示文本“未找到” - 另外,我创建了这个git repo作为一个简单的沙盒来演示这个问题。 - ChaseMoskal
2个回答

8

这基本上是我们在应用程序中配置的方式。

它使用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 ) ;

1
尼古拉斯,对于静态路径来说那是可以的,但路由器的好处在于允许使用动态路由参数。例如,考虑一个多租户应用程序 - /public/:tenant/:site/:slug* - 因为静态路径挂载到了应用程序而不是路由器中间件,所以你无法使用动态路径。你有什么想法? - Tremendus Apps

1
另一个选项是将静态文件夹包装起来,以便它可以作为路由器的回退。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接