设置静态资产路径,使用 koa 和各种中间件路由端点
Setting up static assets paths, routing endpoints with koa and various middleares
问题:
- 如何设置我的静态文件,以便我的
index.html
可以看到这两个目录。
- 当您使用 koa-router 访问默认路由时,我如何发送我的
index.html
与当我发出 AJAX Get 请求时仅发送 .json
文件?
要求:
我需要静态目录在我的应用程序中可见 src/index.html
node_modules
需要为js库打开
src/assets
需要打开图片。
我需要一个路由器用于两个目的:
1) 提供初始 index.html
2) 我的数据库的 CRUD 端点。
注意:我完全愿意 add/subtract 任何中间件。但我宁愿不改变我组织目录的方式。
目录结构:
中间件:
- koa-static // 无法提供 node_modules + src 目录。
- koa-send // 可以发送静态文件但是会破坏 koa-static
- koa-router // 不能
app.js
var serve = require('koa-static');
var send = require('koa-send');
var router = require('koa-router')();
var koa = require('koa');
var app = koa();
// need this for client side packages.
app.use(serve('./node_modules/'));
// need this for client side images, video, audio etc.
app.use(serve('./src/assets/'));
// Will serve up the inital html until html5 routing takes over.
router.get('/', function *(next) {
// send up src/index.html
});
// will serve json open a socket
router.get('/people', function *(next) {
// send the people.json file
});
app.use(router.routes()).use(router.allowedMethods());
// errors
app.on('error', function(err, ctx){
log.error('server error', err, ctx);
});
app.listen(3000);
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Morningharwood</title>
</head>
<body>
<h1>suchwow</h1>
<img src="./assets/image1.png" alt="butts"> <!-- will 404 with routing -->
<script src="./node_modules/gun/gun.js"></script> <!-- will always 404 -->
<script>
var gun = Gun(options);
console.log(gun);
</script>
</body>
</html>
嗯。碰巧我正在开发一种类似的应用程序
使用 koa-static 为您提供静态内容和 koa-router 为您提供 api 端点没有问题。我从来没有直接使用过koa-send。但我认为你也不需要,鉴于你的设置
唯一重要的是将中间件附加到 koa 应用程序时的顺序。尝试首先为您的资产(甚至 index.html)附加 koa-static,然后为您的 api 使用 koa-router。试图获取一些静态文件的请求永远不会到达路由器。这样路由器的唯一责任就是为您的api
服务
如果这不可行(例如,因为您有一堆非静态 html 文件到服务器,请考虑每个应用程序可以有多个路由器,甚至将一个嵌套在另一个中
(如果回答不够,给点时间煮个简单的例子,我会尽快post)
编辑:添加了一个快速而肮脏的示例 here。可能不是开箱即用,但足以让我明白
问题:
- 如何设置我的静态文件,以便我的
index.html
可以看到这两个目录。 - 当您使用 koa-router 访问默认路由时,我如何发送我的
index.html
与当我发出 AJAX Get 请求时仅发送.json
文件?
要求:
我需要静态目录在我的应用程序中可见 src/index.html
node_modules
需要为js库打开src/assets
需要打开图片。
我需要一个路由器用于两个目的:
1) 提供初始
index.html
2) 我的数据库的 CRUD 端点。
注意:我完全愿意 add/subtract 任何中间件。但我宁愿不改变我组织目录的方式。
目录结构:
中间件:
- koa-static // 无法提供 node_modules + src 目录。
- koa-send // 可以发送静态文件但是会破坏 koa-static
- koa-router // 不能
app.js
var serve = require('koa-static');
var send = require('koa-send');
var router = require('koa-router')();
var koa = require('koa');
var app = koa();
// need this for client side packages.
app.use(serve('./node_modules/'));
// need this for client side images, video, audio etc.
app.use(serve('./src/assets/'));
// Will serve up the inital html until html5 routing takes over.
router.get('/', function *(next) {
// send up src/index.html
});
// will serve json open a socket
router.get('/people', function *(next) {
// send the people.json file
});
app.use(router.routes()).use(router.allowedMethods());
// errors
app.on('error', function(err, ctx){
log.error('server error', err, ctx);
});
app.listen(3000);
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Morningharwood</title>
</head>
<body>
<h1>suchwow</h1>
<img src="./assets/image1.png" alt="butts"> <!-- will 404 with routing -->
<script src="./node_modules/gun/gun.js"></script> <!-- will always 404 -->
<script>
var gun = Gun(options);
console.log(gun);
</script>
</body>
</html>
嗯。碰巧我正在开发一种类似的应用程序
使用 koa-static 为您提供静态内容和 koa-router 为您提供 api 端点没有问题。我从来没有直接使用过koa-send。但我认为你也不需要,鉴于你的设置
唯一重要的是将中间件附加到 koa 应用程序时的顺序。尝试首先为您的资产(甚至 index.html)附加 koa-static,然后为您的 api 使用 koa-router。试图获取一些静态文件的请求永远不会到达路由器。这样路由器的唯一责任就是为您的api
服务如果这不可行(例如,因为您有一堆非静态 html 文件到服务器,请考虑每个应用程序可以有多个路由器,甚至将一个嵌套在另一个中
(如果回答不够,给点时间煮个简单的例子,我会尽快post)
编辑:添加了一个快速而肮脏的示例 here。可能不是开箱即用,但足以让我明白