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

标签 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 = 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);
     })
};

问题是,当我导航到使用 getDown.js 的 html 页面时,我在 getDown.js 上收到以下错误

require is not defined

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

最佳答案

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

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

使用Browserify

或者您可以编写 Node 风格的代码,需要像您正在做的那样的全局代码,然后通过 browserify 运行代码。这将创建一个可由客户端执行的新 JavaScript 包,因此您应该告诉 html 页面使用该包而不是 getDown.js

这是一个使用 browserify 的基本示例。

module.js

function getIp() {
  return 123456;
}

module.exports = {
  getIp: getIp
};

main.js

var module = require('./module');

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

console.log(getIp());

编译包

$ browserify main.js -o public/bundle.js

index.html

<script type="text/javascript" src="public/bundle.js"></script>

客户端全局变量

要在客户端上使用服务器已知的全局变量,您可以将该变量传递给渲染引擎(如果您使用的是 Express,则可能是 Jade),并让它将该变量插入到定义一些全局变量的 <script> 标记中。如果您喜欢这种方法,请发表评论,我可以添加更多详细信息。

如果您还有其他问题,请告诉我!

关于javascript - 如何在客户端使用 Node.js 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35893985/

相关文章:

javascript - 检查表单内的任何输入是否为空

jquery - 使用 jquery 仅在特定的 css 类上显示工具提示

javascript - 将 JavaScript 字符串变量转换为小数/货币

javascript - 循环剑道甘特排

javascript - 我需要对用户输入名称 Javascript 的数组顺序进行排序

node.js - 如何在 Mongoose 中命名与数据库名称不同的外键

javascript - 如何从 promise 中的事件处理程序返回值?

javascript - 如果 img < 500 应用 css

javascript - Bootstrap Tour 不会加载到模态框上

node.js - Passport 错误 : Unknown authentication strategy "local"