如何生成Quasar SSR全栈应用程序?

2024-01-21

Context:我正在从 Nuxt 迁移到 Quasar 框架,最初我想将我的全栈应用程序从 Nuxt 移植到 Quasar SSR 模式。使用 Nuxt 时,应用程序默认是全栈的,我们只需要将后端相关文件放在服务器目录中(请参阅https://nuxt.com/docs/guide/directory-struct/server#server-directory https://nuxt.com/docs/guide/directory-structure/server#server-directory).

问题:我已经创建了我的第一个 Quasar 应用程序并添加了 SSR 模式,但我找不到任何类似于 Nuxt server-directory 的东西:-( 所以问题是:Quasar 是否提供类似于 Nuxt server-directory 的东西?如何生成 Quasar SSR全栈应用?


我不认为 Quasar 提供类似的东西服务器目录开箱即用,但Quasar是一个相当灵活的框架,我们可以通过使用Quasar SSR 中间件 https://quasar.dev/quasar-cli-vite/developing-ssr/ssr-middleware :-)

这个想法是:

SSR 中间件是一个附加层,所有浏览器请求都应该通过该层。因此,我们需要做的就是添加一个额外的 SSR 中间件,以在尝试访问特定路由时拦截浏览器请求(在本例中,/api/*)。一步步:

免责声明:当然,它仅在 SSR 模式下运行 Quasar 时才有效。

  1. 考虑到我们已经创建了 Quasar 应用程序,并且已经添加了 SSR 模式(npm init quasar && cd my-app && quasar mode add ssr),让我们使用以下命令添加一个额外的 SSR 中间件“api”:
quasar new ssrmiddleware api
  1. 之后我们需要将 SSR 中间件包含到quasar.config.js:
ssr: {
    ...
    middlewares: [
        'api', // <= this is our SSR-middleware (keep this as first one)
        'render' // keep this as last one
    ]
},
...
  1. 最后一步是将浏览器请求拦截实现到我们的 SSR 中间件文件中src-ssr/middlewares/api.ts:
export default ssrMiddleware(async ({ app, resolve }) => {
    app.all(resolve.urlPath('*'), (req, res, next) => {
        if (req.url.substring(0, 4) === '/api') {
            // Here we can implement our backend NodeJS/Express related operations.
            // See the example below "Real-life example", which provides
            // something similar to Next/Nuxt server-directory functionality.
            res.status(200).send(`Hi! req.method: ${req.method}, req.url: ${req.url}`);
        } else {
            next();
        }
    });
});

现在我们可以启动 Quasar SSR 应用程序,并通过将浏览器指向 http://localhost:9100/api/foo/bar/ 来查看 API 的运行情况 回复 => 嗨! req.method: GET, req.url: /api/foo/bar/


现实生活中的例子:

更新根据@David https://stackoverflow.com/users/13765033/david-wolf的建议。谢谢 :-)

  1. 为了提供类似于 Next/Nuxt 服务器目录功能,我们需要在 SSR 中间件文件中包含一些额外的代码行src-ssr/middlewares/api.ts。下面的示例映射所有可用的 API-Handler(请参阅 apiHandlers 对象)并根据请求 URL 选择它们来处理浏览器请求:
import { ssrMiddleware } from 'quasar/wrappers';

const apiHandlers: { [key: string]: any } = {
  'req-info': import('../../src/api/req-info'),
  version: import('../../src/api/version'),
};

export default ssrMiddleware(async ({ app, resolve }) => {
  app.all(resolve.urlPath('*'), (req, res, next) => {
    if (req.url.substring(0, 4) === '/api') {
      try {
        const path = req.url.split('?')[0].substring(5);
        const apiHandler = await apiHandlers[path];
        if (apiHandler) {
          await apiHandler.default(req, res);
        } else {
          res.sendStatus(404);
        }
      } catch (error) {
        console.error(error);
        res.sendStatus(500);
      }
    } else {
      next();
    }
  });
});
  1. 之后我们只需要在文件夹中创建 NodeJS/Express API-Handlers/src/api/.
  • 示例#1:/src/api/version.ts:
import type { Request, Response } from 'express';
export default function (req: Request, res: Response) {
  const version = require('../../package.json').version;
  res.status(200).send(version);
}
  • 示例#2:/src/api/req-info.ts:
import type { Request, Response } from 'express';
export default function (req: Request, res: Response) {
  res.setHeader('Content-Type', 'text/html');
  res.status(200).send(`
  <ul>
    <li>req.url: ${req.url}</li>
    <li>req.method: ${req.method}</li>
    <li>req.query: ${JSON.stringify(req.query)}</li>
  </ul>`);
}

我希望它有帮助,谢谢! 如果是这样,请投票:-)

StackBlitz 项目:https://stackblitz.com/edit/quasarframework-uocha6 https://stackblitz.com/edit/quasarframework-uocha6

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何生成Quasar SSR全栈应用程序? 的相关文章

随机推荐

  • 绘图程序

    我倾向于成为一个视觉思考者 因此 如果我可以想象程序中的数据流 那么我就可以更好地理解其中发生的事情 而不是阅读正在发生的事情的文本故事 伪代码 有没有一种方法可以直观地表示变量和对象流经函数以及被函数更改的方式 最好是在小规模 单个函数内
  • 如何使用 NSUserDefaults 在 Swift 中保存 Int 数组?

    这是一个数组 var myArray 1 它包含Int values 这就是我保存数组的方式NSUserDefaults 这段代码似乎工作正常 NSUserDefaults standardUserDefaults setObject my
  • 关闭后如何清除模态中的反应状态?

    我有一张显示产品详细信息的产品卡 底部有一个 编辑 button When clicked它显示了一个预填充的模态input字段 可以编辑然后保存 模态框也可以关闭而不保存 但已编辑输入字段 我的问题是 当用户编辑字段时 然后关闭模式 不保
  • iOS 16 模拟器:在模拟器中运行应用程序会导致“.xpc 错误”

    更新到 macOS 13 0 Beta 并安装 Xcode 14 0 Beta 后 我们运行一个应用程序 将目标操作系统设置为 16 出现以下错误 手动启动时 iPhone 模拟器也不会启动 这里是描述问题的详细错误消息 Details T
  • 将镜像从 ECR 拉取到 Kubernetes 部署文件

    我在从 AWS ECR 存储库中提取 docker 映像时遇到了这个问题 之前我使用过 kubectl create secret docker registry regcred docker server https index dock
  • 在 MATLAB 中执行此类 Python 向量化赋值的等效方法是什么?

    我正在尝试将这行代码从 Python 转换为 MATLAB new img M 0 corners 0 0 M 1 corners 1 0 img T 0 T 1 所以 很自然地 我写了这样的东西 new img M 1 corners 2
  • 导入Visual Studio测试项目时如何创建vsmdi/testrunco​​nfig文件?

    当我添加现有测试项目时 我的解决方案缺少 vsdmi 和 testrunco nfig 文件 如何创建它 这个问题的解决方案有点棘手 您必须将 新项目 添加到您的解决方案中 而不是您的测试项目中 在 添加新项目 对话框中 您可以选择 测试运
  • 使首选项看起来已禁用,但仍记录点击

    因此 在我的应用程序的某些状态下 我想在我的设置菜单中禁用某些 CheckBoxPreferences 但是 如果用户单击它们 我希望显示一个解释性的 toast 如果我只是执行 setEnable false 在 CheckBoxPref
  • 该项目需要一个淘汰计时器

    我的项目需要一个淘汰计时器 只需单击一下即可在计时器达到 0 后重新启动 我有以下代码 但这不会重新启动 有人可以帮助我吗 this countDown ko observable ko bindingHandlers timer upda
  • 根据相似度匹配 2 个字符串列表

    Problem 我有 2 个字符串列表 我想从我的列表中找到最匹配的对 例如 我有这两个列表 list1 a1 b1 c1 list2 a2 b2 c2 我想得到以下结果 results a1 a2 b1 b2 c1 c2 附加信息 为了比
  • 使用 R 将 t 分布叠加到我的直方图上?

    如何使用 R 将 t 密度叠加到直方图上 这是我的功能 simfun lt function a 56 25102409 b 1 78977412 c 0 08664925 n 18 x1 sd 18 87671 x2 sd 18 8767
  • smack 4.1 Openfire 示例示例 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我的门户网站一直使用 smack 3 4 我的 Android 应用程序也使用了 asmack 3 4
  • Logstash:将 URL 参数获取到哈希值中

    我正在尝试使用 Logstash 和 ElasticSearch 来监视我的 Apache Web 服务器活动 目前 它工作得很好 但我需要有关我的请求字段的更多具体信息 此时我的logstash配置是 filter grok match
  • 如何获取 JSON Key 和 Value?

    我编写了以下代码来从 Web 服务获取 JSON 结果 function SaveUploadedDataInDB fileName ajax type POST url SaveData asmx SaveFileData data Fi
  • 为 iOS 构建一个静态库 - 特别是spatialite

    首先 请原谅并指出我是否要使用其他协议来引用另一个线程 帖子 之前有一个话题如何为iOS编译spatialite https stackoverflow com questions 4793970 how to compile spatia
  • Spring 3.1 HandlerInterceptor 没有被调用

    我遵循了 HandlerInterceptors 的文档 请注意 在新版本的 Spring 中 配置的拦截器将应用于所有使用带注释的控制器方法处理的请求 The following is in an xml configuration fi
  • json.net 中的奇怪行为:为什么 null JToken 被替换为非 null 值?

    这使用 json net C 不知道为什么 JToken 不为空 var obj new JObject obj field1 null var token obj field1 Console WriteLine token null f
  • 在 Matlab 中计算 2D 点列表的熵

    我有一个像这样的数组中的点列表 points 1 2 2 5 7 1 x y x 介于 0 到 1020 之间 y 介于 0 到 1920 之间 如何在Matlab中计算点数组的熵 非常感谢 我假设你想考虑每一个 x y 点作为一个数据点
  • 修复了 AngularJS 中的标头表

    我陷入了涉及固定头表的问题 我正在使用 AngularJS 和 Bootstrap 来构建一个 Web 应用程序 我不能使用ng grid因为它不支持IE7 所以 我通过以下方式填充表行ng repeat 该应用程序是反应灵敏 因此 我无法
  • 如何生成Quasar SSR全栈应用程序?

    Context 我正在从 Nuxt 迁移到 Quasar 框架 最初我想将我的全栈应用程序从 Nuxt 移植到 Quasar SSR 模式 使用 Nuxt 时 应用程序默认是全栈的 我们只需要将后端相关文件放在服务器目录中 请参阅https