我对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中使用它,我希望我能够自己解释得很好,谢谢你。
答案 0 :(得分:0)
require
是Node.js代码中存在的全局代码,即服务器中执行的javascript代码。
您的服务器将响应客户端并为其提供要呈现的HTML页面。该HTML页面可以告诉浏览器也从服务器请求javascript文件。当它收到该文件时,客户端将执行它。客户端不具有require
全局(您可以通过打开控制台并键入require
来测试它)
或者您可以编写节点式代码,要求您的全局代码正在执行,但随后通过browserify运行代码。这将创建一个可由客户端执行的新javascript包,因此您应该告诉您的html页面使用该包而不是getDown.js
。
以下是使用此类浏览器的基本示例。
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>
要在服务器已知的客户端上使用全局变量,您可以将该变量传递给渲染引擎(如果您使用Express,则可能是Jade)并将该变量插入到{{1标签定义了一些全局变量。如果这是您更喜欢的方法,请发表评论,我可以添加更多详细信息。
如果您有更多问题,请与我联系!