让我先说一下,我花了相当多的时间试图找出解决这个问题的方法,但我还没有发现一些有效的方法。我正在使用节点,并希望在我的app.js服务器文件和客户端javascript文件(demo.js)之间共享一个变量。
我运行node app.js
启动服务器,demo.js在客户端运行。我尝试过使用module.exports
和export
但是当我尝试导入demo.js文件或引用module.exports
var时,我会收到错误。也许我接近这个是错误的。
例如,我正在尝试使用节点维基百科包来抓取数据。我的app.js文件中有以下内容:
var wikipedia = require('node-wikipedia');
wikipedia.page.data('Clifford_Brown', { content: true }, function(response) {
console.log(response);
export const response = response;
module.exports.data = response
});
在我的demo.js文件中,我尝试导入此响应var并使用module.exports
var,但我没有成功。
任何人都有这个问题的解决方案或我应采取的不同方法吗?
答案 0 :(得分:3)
浏览器javascript文件在浏览器中运行。 node.js javascript文件在服务器上运行。您不能直接将东西从一个导出到另一个。它们位于不同位置的完全不同的计算机上。
对于开发人员而言,理解服务器端代码在服务器上运行并且客户端代码在浏览器上运行的概念非常重要。两者不能直接相互调用或达到其他变量。想象一下,您的服务器位于西雅图的数据中心,浏览器正在威尼斯的计算机上运行。
请参阅How to access session variables in the browser,了解针对上一个答案所描述的各种选择。
简而言之,您可以让服务器在生成的网页中插入一个javascript变量,这样当javascript在浏览器的网页上运行时,它就可以在自己的页面中访问该变量。或者,您可以创建Ajax调用,以便客户端可以直接从服务器请求数据。或者您可以让服务器将一些数据放入cookie中,然后浏览器中的Javascript可以访问该cookie。
如果在生成页面时服务器很容易知道数据并且您正在使用某种页面模板系统,那么只需在生成的页面中添加<script>
标记即可定义一个或多个包含所需信息的Javascript变量。然后,客户端Javascript可以引用这些变量来访问数据。
答案 1 :(得分:1)
要在http中传递数据,有一条请求消息和响应消息,数据需要在该消息中。
在请求中,您可以在请求URL中传递变量
http://host_name/path?key=value
或在请求正文或标题内。
在响应中,您传回响应标头或响应正文中的变量
第一个例子:
在传递变量时显式处理来自浏览器的URL请求的一种方法是设置服务器以呈现嵌入了这些变量的html页面。
如果您使用像jade这样的模板引擎,则可以使用res.render({ key: 'value' })
将发送的变量直接传递到模板中,而不是使用基于promise的api调用,该调用将在用户对客户端执行某些操作时运行。 / p>
例如。
// SERVER setup rendering engine
app.get('/', function(req, res) {
res.render( 'index', { key: 'value' })
}
将index.html
呈现给客户端,并将键值对传递给用于提供index.html的模板文件(例如jade或ejs)。
第二个例子:
使用axios,您可以设置一个动作来调用服务器api(您也可以在URL,标题或正文中传递变量)。使用promise模式,您可以在服务器api响应后使用这些变量。
// CLIENT setup axios
axios.get(URL + '/getkeyvalue')
.then(function(response) {
const value = response.data.key
})
在你的服务器上使用express you(这是你将获得上面提到的可选请求变量的地方)在这样的身体中发回响应变量。
// SERVER setup express
app.get('/getkeyvalue', function(req, res) {
res.send({ key: 'value' })
}
请注意,这些都是简单的例子。
答案 2 :(得分:0)
它们是完全不同的系统。完成您要做的事情的最佳方法是通过字符串化数据在服务器端的html中创建变量
<script> var my_data = <%= JSON.stringify(data) %> </script>
这是一个使用ejs的例子,这是expressjs中常用的模板语言