向客户端公开一个node.js变量

时间:2019-03-24 05:33:58

标签: node.js express pug

我想向客户端公开一个node.js服务器变量。我正在尝试让工作暴露在外。 我不确定如何初始化和使用该库。

在快速暴露指南中,这种用法没有意义

var express = require('express');
var expose = require('express-expose');
app = expose(app);
app.expose(...);

如何在初始化之前在'expose(app')中使用应用程序?

我用过

const app = expose(express());
app.expose('var some = "variable";','head');

但这似乎也不起作用。

任何人都可以给我提供一个示例,该示例初始化express-expose库并将var“ some”导出到客户端吗?

(通过向客户端公开,我的意思是它将对我所有的javascript文件都可用,作为一个全局变量,这样我就可以执行“ console.log(some);”并打印其值)

3 个答案:

答案 0 :(得分:3)

使用Pug

由于您将ExpressPug配合使用,因此只需调用res.render函数并为其提供所需的变量。这是这样做的方法。

假设您有一个名为index.pug的模板,看起来可能像这样:

html
  head
    title= title
  body
    h1= message

在您的服务器上,负责渲染的代码应如下所示。在这种情况下,我们将someVariable传递到需要呈现的视图。

const someVariable = 'hello world!';

app.get('/', function (req, res) {
  res.render('index', { title: 'Hey', message: someVariable })
})

关于express-expose

的注释

express-expose库未维护,并且五年内未更新。我的建议是按照前面所述的方式呈现变量,或仅使用AJAX请求。

关于使用全局变量的说明

  

我正在使用“ pug”视图引擎。它传递给视图,但我想要   作为全局javascript变量。

一个更好的主意是使用Template Inheritence创建“通用布局” 并根据需要扩展它们。如果要在后端更改它,则与要渲染的文件共享全局变量不会在前端神奇地更新它。即使该变量是全局变量。

如果要反映“实时更改” ,则应查看Socket.io

答案 1 :(得分:2)

这似乎是一种代码气味...但是,不管怎么说,有更清洁的方法可以做到这一点。

如果要公开一个数据对象,即仅包含键和值的对象,则可以将其嵌入呈现的网页中,通过客户端可以通过AJAX请求获取的某些API端点使其可用,或者公开可通过<script>包含的原始Javascript文件(或者我猜pug中的script(...))。

如果要公开更复杂的Javascript对象,例如类或具有函数定义的对象,则可以公开Javascript文件并通过script(...)将其包括在内。

但是,非常您应该非常小心地公开服务器使用的文件。如果存在任何漏洞,它们现在是公开的。如果有任何硬编码的密码(无论如何都不应该在代码中),它们现在是公开的。该文件中的所有内容现在都是公开的,因此,如果您确实要执行此操作,请务必小心将哪些代码插入到此客户端文件中。

如果您需要更多有关如何工作的详细信息,请发表评论:)

编辑:还请注意,使用内嵌和包含方法将不允许即时更新变量。如果您需要客户端跟踪服务器上数据的任何更改,则需要使用AJAX。我认为这是最好的方法。它为您提供最大的灵活性。

另一个编辑:从express-expose project的问题来看,它似乎没有得到很好的支持,并且可能存在安全问题。现在,我会避免它。也许以后会有用而且安全的。

答案 2 :(得分:1)

如果要从server向客户端公开一个变量值,而该变量值永远不会更改或更新,则只需在模板中添加一个隐藏的输入字段并为其添加值

在您的EJS模板文件中,看起来像

<% if (data) { %>
  <input type="hidden" value="<%= data %>" id="myGlobal"/>
<% } %>

您必须将res.render('template',{data:"hello"})函数中的数据值传递给模板。

您可以使用简单的document.getElementById("myGlobal")从客户端访问此变量值。同样,不要在隐藏字段中传递任何敏感信息。

如果要传递敏感信息,请在服务器中实施身份验证并通过ajax调用从客户端调用该端点。这也是从客户端更新变量值的最佳方法