【问题标题】:Express - Pass JavaScript data to client without view engineExpress - 在没有视图引擎的情况下将 JavaScript 数据传递给客户端
【发布时间】:2018-08-13 00:40:13
【问题描述】:

我有一个通过快速服务器提供服务的应用程序。我正在用 vanilla JavaScript 构建我的所有模板,没有任何模板文件或视图引擎。我想传递将在客户端的 JavaScript 上下文中用于正常导航请求的数据。这样做的最佳做法是什么?

我根本没有使用 AJAX 或单页应用程序。我所有的模板都在服务器上完全呈现。这是服务器的基本版本:

const express = require('express')
const app = express()

const meta = `<meta name="viewport" content="width=device-width, initial-scale=1">`
const account = `<button id="sign-out" class="js-authorized">Sign Out</button>`
const template = (title, content) => `<html>
<head>
  <title>${title}</title>

  ${meta}
</head>
<body>
  <div class='account'>
    ${account}
  </div>

  <div class='content'>
    <h1>${title}</h1>

    ${content} 
  </div>
</body>`

app.get('/', (request, response) => {
  const document = template('Index', 'Welcome')

  // How can I send this to the client?
  const data = {
    mainSeed: Math().random(),
    secondarySeeds: [Math().random(), Math().random(), Math().random()]
  }
  // This wouldn't work:
  // return response.send(data, document)

  return response.send(document)
})

我想确保页面上的任何 JavaScript 都可以访问数据,但我不想在服务器上使用除 JavaScript 模板文字之外的任何模板逻辑。通过基本 Express 向客户端发送数据的最佳做法是什么?

【问题讨论】:

  • 找到了这个帖子,但不知道它是否没有视图引擎:stackoverflow.com/questions/21172889/…希望它会有所帮助
  • 感谢您的努力,但是通过线程查看,建议的解决方案要求它是一个 AJAX 请求(我的是正常的导航请求),并且它们需要一个视图引擎,以便 render 方法可以使用。

标签: javascript node.js express routing httpresponse


【解决方案1】:

我想传递将在客户端 JavaScript 上下文中用于正常导航请求的数据。这样做的最佳做法是什么?

通过使用视图引擎呈现您的数据或限制/强制您的 ajax 请求请求application/json,以便您可以使用 JSON 进行响应。

您想要做的基本上就是 React、Vue 和 Angular 已经为您做的事情。如果您真的不想使用普通 HTML,请使用 React 或众多 SPA 框架/库之一。

你试图完成的事情不会奏效。 res.send 只接受 一个 参数:res.send([body])。你不能像你试图做的那样用它发送任何其他东西。 hack 解决方法(未经测试)是这样的:

const template = (title, content, data) => `<html>
<head>
  <title>${title}</title>

  ${meta}
</head>
<body>
  <div class='account'>
    ${account}
  </div>

  <div class='content'>
    <h1>${title}</h1>

    ${content} 
  </div>
</body>
<script>
  window.data = ${data}
<script>
`

const document = template('Index', 'Welcome', {data: {} })

在这一点上,这与使用视图引擎有何不同?它完成了同样的事情。如果您要使用视图引擎,则可以使用res.render:

app.get('/', (request, response) => {
  const data = {
    mainSeed: Math().random(),
    secondarySeeds: [Math().random(), Math().random(), Math().random()]
  }

  response.render('Index', { data, content: 'Welcome' })
})

【讨论】:

  • 我没有使用 AJAX 或 SPA。我的模板在服务器上呈现。我只想使用 JS 字符串来构建我的模板。我不想使用单独的文件或目录,也不想使用 JS 模板文字以外的模板语法。我希望视图引擎的唯一功能是在 JS 页面上下文中包含数据。有没有这样一种方法可以使用视图引擎来这样做,同时以同样的方式渲染我的模板? Handlebars 或 Pug 如何在其上下文中包含 JS?我可以在我的模板函数中复制他们的技术吗?
  • 你让它变得比它需要的更难,但你的问题没有。视图引擎(您提到的以及更多)接收视图/文件的名称及其任何数据并适当地解析它。您可以尝试复制 pug 的逻辑,您可以看到 here,但此时,您最好使用视图引擎而不是自己发明。唯一的区别是您将它压缩成一个文件而不是两个。
  • 我的长期计划是创建自己的视图引擎,但是当我这样做时,我需要知道包含 JavaScript 的最佳方式。我试着浏览了你链接的代码,但是有很多,我一直没能找到清楚显示 JS 数据是如何包含的部分。
  • 解析哈巴狗模板的实际包是this 一个,但正如您所见,它和哈巴狗本身的许多其他部分一样复杂。如果没有一个可以满足您的需求,请务必制作您自己的视图引擎,但请记住,如果您要尝试参考其他成熟的引擎......您将在漫长的夜晚倾注于冗长的内容源代码。
  • 我同意,这不是一个好的短期策略。这就是为什么我希望了解 pug 的最佳实践是基于什么实现的,即服务器发送的 JavaScript 数据应该在哪里以及如何包含在页面中。希望会有答案。我也在考虑使用 cookie,但当然也有很多问题。
猜你喜欢
  • 2013-10-06
  • 2017-04-02
  • 2015-06-17
  • 2011-11-11
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多