首页 > 解决方案 > Koa-Router:如果请求不在 XHR 中,则跳过路由

问题描述

我有一个用 Koa 制作的带有一些路由的 Rest API,但同时,它将为我的 Front 服务(使用 JS 框架和它自己的路由器制作)。

事实是,当我从浏览器“localhost/user”访问时,我想显示前面,但是当我从fetch / ajax / XMLHttpRequest到达相同的 url 时,我想显示 JSON 结果(由 Koa-router 提供的结果) )。

因此,我只想从 API 启用 /user 路由,前提是它是从 XHR 调用的。

我做了这样的 isXMLHttpRequest 中间件:

module.exports = async (ctx, next) => {
    if(ctx.request.get('X-Requested-With') === 'XMLHttpRequest') {
        return next()
    }
}

然后,在我的 koa-router 中,我做了类似的事情:

const Router = require('koa-router')

const isXMLHttpRequest = require("@middlewares/isXMLHttpRequest")

const router = new Router()

const user = require("@routes/user")
router.use('/user', isXMLHttpRequest, user.routes(), user.allowedMethods())

然后,当我执行一些 XHR 请求时它可以工作,我按计划拥有 JSON,但是如果我尝试从浏览器访问 /user,API 会给我一个 Not Found Error 而不是我的前面......

如果请求不是在 XHR 中发出的,我正在寻找如何跳过 router.use 功能,但我找不到解决方案......

我认为这是在中间件的其他情况下,我必须返回一些东西,但是我该怎么做才能跳过 koa-router 给我 404 ...

也许你能帮助我?

标签: node.jsajaxxmlhttprequestkoakoa-router

解决方案


不确定我的问题是否正确。所以你有一个像静态 Web 服务器和 REST API 一样的后端,对吧?

我会尝试反过来做。使用例如 koa-static ( https://www.npmjs.com/package/koa-static ) 将首先尝试提供您的文件,如果在您定义的公共目录中找不到匹配的文件,则所有其他路由(所以您的 REST API ) 被处理。然后您只需确保端点名称不会与您正在服务的文件重叠。


推荐阅读