向客户端公开一个 node.js 变量
Exposing a node.js variable to the client
我想向客户端公开一个 node.js 服务器变量。我正在努力让 express-expos 开始工作。
我不确定如何初始化和使用该库。
express-expose 指南中的用法没有意义
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);' 并且它会打印它的值)
这似乎有点代码味道...但无论如何,有更简洁的方法来做到这一点。
如果你想公开一个数据对象,即一个只包含键和值的对象,你可以将它嵌入到呈现的网页中,通过客户端可以获得的一些 API 端点使其可用通过 AJAX 请求,或公开一个原始 Javascript 文件,该文件可以通过 <script>
包含(或者我猜 pug 中的 script(...)
)。
如果您想公开更复杂的 Javascript 对象,例如 class 或具有函数定义的对象,您可以公开 Javascript 文件并通过 script(...)
。
但是,您应该非常小心暴露服务器使用的文件。如果有任何漏洞,它们现在是 public。如果有任何硬编码密码(无论如何都不应该在代码中),它们现在是 public。此文件中的任何内容现在都是 public,因此如果您确实想要这样做,请务必小心进入此客户端文件的代码。
如果您需要有关其工作原理的更多详细信息,请发表评论:)
编辑:另请注意,使用嵌入式和包含方法不允许即时更新变量。如果您需要客户端在服务器上更改数据时跟踪对数据的任何更改,您将需要使用 AJAX。在我看来,这是最好的方法。它为您提供最大的灵活性。
另一个编辑:从 express-expose project 上的问题来看,它似乎没有得到很好的支持,并且可能存在安全问题。现在,我会避免它。也许以后会有帮助和安全。
如果你想从服务器向客户端公开一个变量值,它永远不会改变或更新,你可以简单地在你的模板中添加一个隐藏的输入字段并添加它的值
在您的 EJS 模板文件中,这看起来像
<% if (data) { %>
<input type="hidden" value="<%= data %>" id="myGlobal"/>
<% } %>
您必须将 res.render('template',{data:"hello"})
函数中的数据值传递给模板。
您可以使用简单的 document.getElementById("myGlobal")
从客户端访问此变量值。同样不要在隐藏字段中传递任何敏感信息。
如果您想传递敏感信息,请在您的服务器中实现一个端点并通过 ajax
调用从客户端调用端点。这也是更新变量值的最佳方法客户端。
使用Pug
由于您将 Express
与 Pug
一起使用,您只需调用 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
库无人维护,5 年未更新。我的建议是只按照前面所述渲染变量,或者只使用 AJAX 请求。
关于使用全局变量的注意事项
I am using the 'pug' view engine. It is passed to the view but I want
it as a global javascript variable.
一个更好的主意是使用 Template Inheritence 创建 "generic layouts" 并根据需要扩展它们。如果您在后端更改它,则与您正在呈现的文件共享全局变量不会在前端神奇地更新它。即使变量是全局的。
如果你想反映 "real-time changes" 你应该看看 Socket.io.
我想向客户端公开一个 node.js 服务器变量。我正在努力让 express-expos 开始工作。 我不确定如何初始化和使用该库。
express-expose 指南中的用法没有意义
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);' 并且它会打印它的值)
这似乎有点代码味道...但无论如何,有更简洁的方法来做到这一点。
如果你想公开一个数据对象,即一个只包含键和值的对象,你可以将它嵌入到呈现的网页中,通过客户端可以获得的一些 API 端点使其可用通过 AJAX 请求,或公开一个原始 Javascript 文件,该文件可以通过 <script>
包含(或者我猜 pug 中的 script(...)
)。
如果您想公开更复杂的 Javascript 对象,例如 class 或具有函数定义的对象,您可以公开 Javascript 文件并通过 script(...)
。
但是,您应该非常小心暴露服务器使用的文件。如果有任何漏洞,它们现在是 public。如果有任何硬编码密码(无论如何都不应该在代码中),它们现在是 public。此文件中的任何内容现在都是 public,因此如果您确实想要这样做,请务必小心进入此客户端文件的代码。
如果您需要有关其工作原理的更多详细信息,请发表评论:)
编辑:另请注意,使用嵌入式和包含方法不允许即时更新变量。如果您需要客户端在服务器上更改数据时跟踪对数据的任何更改,您将需要使用 AJAX。在我看来,这是最好的方法。它为您提供最大的灵活性。
另一个编辑:从 express-expose project 上的问题来看,它似乎没有得到很好的支持,并且可能存在安全问题。现在,我会避免它。也许以后会有帮助和安全。
如果你想从服务器向客户端公开一个变量值,它永远不会改变或更新,你可以简单地在你的模板中添加一个隐藏的输入字段并添加它的值
在您的 EJS 模板文件中,这看起来像
<% if (data) { %>
<input type="hidden" value="<%= data %>" id="myGlobal"/>
<% } %>
您必须将 res.render('template',{data:"hello"})
函数中的数据值传递给模板。
您可以使用简单的 document.getElementById("myGlobal")
从客户端访问此变量值。同样不要在隐藏字段中传递任何敏感信息。
如果您想传递敏感信息,请在您的服务器中实现一个端点并通过 ajax
调用从客户端调用端点。这也是更新变量值的最佳方法客户端。
使用Pug
由于您将 Express
与 Pug
一起使用,您只需调用 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
库无人维护,5 年未更新。我的建议是只按照前面所述渲染变量,或者只使用 AJAX 请求。
关于使用全局变量的注意事项
I am using the 'pug' view engine. It is passed to the view but I want it as a global javascript variable.
一个更好的主意是使用 Template Inheritence 创建 "generic layouts" 并根据需要扩展它们。如果您在后端更改它,则与您正在呈现的文件共享全局变量不会在前端神奇地更新它。即使变量是全局的。
如果你想反映 "real-time changes" 你应该看看 Socket.io.