Javascript 如何在客户端使用Node.js变量?

Javascript 如何在客户端使用Node.js变量?,javascript,jquery,node.js,html,Javascript,Jquery,Node.js,Html,我对NODEJS比较陌生,我正在努力解决一个基本问题,那就是全局变量的正确使用。我读了很多关于它的书,但似乎我不能使它正常工作,为了更好地理解这个问题,我将发布一些代码 我有一个简单的js作为服务器运行: myapi.js var http = require('http'); var express = require('express'); var app = express(); var exec = require('child_process').exec, child; var fs

我对NODEJS比较陌生,我正在努力解决一个基本问题,那就是全局变量的正确使用。我读了很多关于它的书,但似乎我不能使它正常工作,为了更好地理解这个问题,我将发布一些代码

我有一个简单的js作为服务器运行:

myapi.js

var http = require('http');
var express = require('express');
var app = express();
var exec = require('child_process').exec, child;
var fs = require('fs');
var jUptime;
var ipExp = require('./getDown');
var filesD = [];
var path = "/media/pi/01D16F03D7563070/movies";

app.use(express['static'](__dirname ));

exec("sudo /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'", function(error, stdout, stderr){
            ip = stdout;
            exports.ipAdd = ip;
            console.log(ip);
});

app.get('/files', function(req, res) {
    fs.readdir(path, function(err, files) {
        if (err){
            console.log("Non riesco a leggere i files");
        }

        filesD=files;
        console.log(filesD);

    });
    res.status(200).send(filesD);
});

app.get('/up', function(req, res) {
    child = exec("uptime -p", function(error, stdout, stderr){
                    jUptime = [{uptime: stdout}];
                });
    res.status(200).send(jUptime);
});

app.get('*', function(req, res) {
    res.status(404).send('Richiesta non riconosciuta');
});

app.use(function(err, req, res, next) {
    if (req.xhr) {
        res.status(500).send('Qualcosa è andato storto');
    } else {
        next(err);
    }
});
app.listen(3000);
console.log('Server attivo sulla porta 3000');
然后我在一个简单的网页中使用了这个JS:

getDown.js

var ip = require('./myapi').ipAdd;
function gDownloads() {
    var url;
    var jqxhr;
    var dat;

        url = 'http://' + ip + '/files';
        jqxhr = $.getJSON(url, function(dat) {
        for(i=0; i<dat.length; i++){
                    $('#downLoad').append('<p>' + dat[i] + '</p>');
        }
        $('#bId').append(dat.length);
        })
     .done(function() {
        console.log("OK");
     })
     .fail(function(data) {
        console.log("Fallito: "+data);
     })
};

我需要在myapi.js中传递包含IP地址的变量,以便在getDown.js中使用它,我希望我的解释足够好,提前感谢。

require
是全局的,存在于Node.js代码中,即在服务器中执行的javascript代码中

您的服务器将响应客户机,并为其提供一个要呈现的HTML页面。该HTML页面可以告诉浏览器也从服务器请求javascript文件。当它收到该文件时,客户端将执行它。客户端没有
require
global(您可以通过打开控制台并键入
require
来测试它)

使用Browserify 或者,您也可以编写节点样式的代码,就像您正在做的那样,需要全局变量,然后运行代码。这将创建一个可由客户端执行的新javascript包,因此您应该告诉html页面使用该包,而不是
getDown.js

下面是这样使用browserify的一个基本示例

module.js main.js 编译包 index.html

客户端上的全局变量 要在客户端上使用服务器已知的全局变量,可以将该变量传递给渲染引擎(如果使用Express,则可能是Jade),并让它将该变量插入到定义一些全局变量的
标记中。如果这是你喜欢的方法,请留下评论,我可以补充更多细节


如果您有更多问题,请告诉我

require
是存在于Node.js代码中的全局代码,即在服务器中执行的javascript代码中

您的服务器将响应客户机,并为其提供一个要呈现的HTML页面。该HTML页面可以告诉浏览器也从服务器请求javascript文件。当它收到该文件时,客户端将执行它。客户端没有
require
global(您可以通过打开控制台并键入
require
来测试它)

使用Browserify 或者,您也可以编写节点样式的代码,就像您正在做的那样,需要全局变量,然后运行代码。这将创建一个可由客户端执行的新javascript包,因此您应该告诉html页面使用该包,而不是
getDown.js

下面是这样使用browserify的一个基本示例

module.js main.js 编译包 index.html

客户端上的全局变量 要在客户端上使用服务器已知的全局变量,可以将该变量传递给渲染引擎(如果使用Express,则可能是Jade),并让它将该变量插入到定义一些全局变量的
标记中。如果这是你喜欢的方法,请留下评论,我可以补充更多细节


如果您有更多问题,请告诉我

除非您在这里使用类似于
browserify
的内容,否则您不能
从浏览器中要求
节点脚本:您的NodeJS代码正在服务器上运行。您的网页代码正在客户端上运行。您得到的错误(“require未定义”)是因为
require
不是浏览器当前提供的东西,除非您使用AMD插件,而且即使您使用了AMD插件,您也不想在客户端网页中包含服务器端代码。@t.J.Crowder这很有意义,那么我如何才能完成我正在尝试的操作呢?我本想用IP调用REST并获取json,但我真的希望避免使用调用。除非您使用类似于
browserify的东西,否则您不能
从浏览器中要求
节点脚本:您的NodeJS代码正在服务器上运行。您的网页代码正在客户端上运行。您得到的错误(“require未定义”)是因为
require
不是浏览器当前提供的东西,除非您使用AMD插件,而且即使您使用了AMD插件,您也不想在客户端网页中包含服务器端代码。@t.J.Crowder这很有意义,那么我如何才能完成我正在尝试的操作呢?我本想打一个REST电话,用IP获取一个json,但我真的不想用这个电话。嗨,谢谢,我更喜欢使用browserify,我通过npm安装了它,并试图使用它,但我正在“努力”使它正常工作,你能修改我上面的代码,让我能理解它吗?我遵循了HTML文件bundle.js中包含的Browserify homepage教程中的确切过程,但在HTML解析器出现后,解析抛出错误:无法读取未定义的属性“prototype”。。。buff…我只需要在我的服务器端代码中使用一个变量…我没想到会这么难!我认为我无法调试为什么您的代码会抛出它,而无法运行和调试它。如果你想你可以发布它github并发布一个链接,但我现在能做的是发布一个使用browserify的基本示例。嗨,谢谢,我更喜欢使用browserify,我通过npm安装了它,并试图使用它,但我正在“努力”使它正常工作,你能修改我上面的代码以便我能理解它吗?我遵循了HTML文件bundle.js中包含的Browserify homepage教程中的确切过程,但在HTML解析器出现后,解析抛出错误:无法读取未定义的属性“prototype”。。。buff…我只需要在我的服务器端代码中使用一个变量…我没想到会这么难!我不认为我可以调试为什么你的代码在没有
require is not defined
function getIp() {
  return 123456;
}

module.exports = {
  getIp: getIp
};
var module = require('./module');

function getIp() {
  var ip = module.getIp();
  return ip;
};

console.log(getIp());
$ browserify main.js -o public/bundle.js
<script type="text/javascript" src="public/bundle.js"></script>