当浏览器中的用户点击按钮时,我需要运行服务器端脚本...
我已经研究了一段时间,但无法弄明白。
我们拥有什么:
更清楚的是,这是我们想要发生的事情:
- >用户访问http:// localhost /index.html
- >用户选择颜色,按“提交”按钮。
- >所选颜色转到bash脚本(在服务器上)./sendColors [listOfColors]
- > bash脚本可以做到这一点。
=====
child_process.spawn
我希望我能在html页面上做到这一点:
var spawn = require('child_process').spawn;
ls = spawn(commandLine, [listOfColors]);
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
ls.on('close', function (code) {
console.log('child process exited with code ' + code);
});
但是这个脚本是服务器端,而不是客户端,所以我不能在html页面上运行它(我相信)。我尝试运行此错误时得到的错误是require未定义。
browserify
我已经尝试过installinst browserify,但是我们使用的机器没有连接到互联网,也无法使用npm install。我已经手动将文件复制到usr / lib并且“必需”它很好,但后来它说它找不到需要“通过”,这是在browserify的index.js ...
getRuntime
尝试了这件事:
var bash_exit_code = 0; // global to provide exit code from bash shell invocation
function bash(command)
{
var c; // a character of the shell's stdout stream
var retval = ""; // the return value is the stdout of the shell
var rt = Runtime.getRuntime(); // get current runTime object
var shell = rt.exec("bash -c '" + command + "'"); // start the shell
var shellIn = shell.getInputStream(); // this captures the output from the command
while ((c = shellIn.read()) != -1) // loop to capture shell's stdout
{
retval += String.fromCharCode(c); // one character at a time
}
bash_exit_code = shell.waitFor(); // wait for the shell to finish and get the return code
shellIn.close(); // close the shell's output stream
return retval;
}
说它不知道Runtime是什么
RequireJS
我查看了RequireJS,但在我的情况下不明白如何使用它
EVAL
我也尝试了eval ...但我认为那是代数表达式......不起作用。
的ActiveX
甚至尝试过activeX:
variable=new ActiveXObject(...
说它不知道ActiveXObject是什么
=====
HttpServer.js:
var http = require('http');
...
var colors = require('./colorsRequest.js').Request;
...
http.get('http://localhost/colorsRequest', function(req, res){
// run your request.js script
// when index.html makes the ajax call to www.yoursite.com/request, this runs
// you can also require your request.js as a module (above) and call on that:
res.send(colors.getList()); // try res.json() if getList() returns an object or array
console.log("Got response ");// + res.statusCode);
});
colorsRequest.js
var RequestClass = function() {
console.log("HELLO");
};
// now expose with module.exports:
exports.Request = RequestClass;
的index.html
...
var colorsList = ...
...
$.get('http://localhost/colorsRequest', function(colors) {
$('#response').html(colorsList); // show the list
});
我正在
GET http://localhost/colorsRequest 404 (Not Found)
有人有任何想法吗?
答案 0 :(得分:17)
这是服务器的简单样板(使用Express,因此您可能需要先安装它:npm install express
):
var spawn = require('child_process').spawn;
var express = require('express');
var app = express();
app.use(express.static(__dirname));
app.get('/colorsRequest', function(req, res) {
var command = spawn(__dirname + '/run.sh', [ req.query.color || '' ]);
var output = [];
command.stdout.on('data', function(chunk) {
output.push(chunk);
});
command.on('close', function(code) {
if (code === 0)
res.send(Buffer.concat(output));
else
res.send(500); // when the script fails, generate a Server Error HTTP response
});
});
app.listen(3000);
你可以传递一种颜色,它将运行shellscript run.sh
(它假定它与服务器JS文件位于同一目录中),颜色作为参数传递:
curl -i localhost:3000/colorsRequest?color=green
# this runs './run.sh green' on the server
这里是一个样板HTML页面(将其保存为index.html
,将其放在与服务器代码和shell脚本相同的目录中,启动服务器,然后在浏览器中打开http://localhost:3000
):
<!doctype html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
<select>
<optgroup label="Pick a color:">
<option>green</option>
<option>blue</option>
<option>yellow</option>
<option>orange</option>
</optgroup>
</select>
<script>
$('select').on('change', function() {
$.get('/colorsRequest', { color : $(this).val() });
});
</script>
</body>
</html>
答案 1 :(得分:3)
使用第一种方法child_process.spawn
变体,你的方法是正确的。当然你不能把它放在HTML页面中,因为它然后在浏览器中执行,而不是在服务器中执行,但你可以在浏览器中轻松创建一个请求(AJAX或页面加载,取决于你需要的东西),触发器在服务器中运行此脚本。