仅在用户在html中选择文件后才在node.js中运行脚本

时间:2014-11-11 13:01:05

标签: javascript html ajax r node.js

我正在使用node.js启动一个服务器,以便我的html可以与R代码通信。但是我在node.js上遇到了问题。在我的html页面中,我有一个浏览选择按钮,用户可以使用它来选择要读入html的数据文件,node.js会将文件名传递给R,因此R代码将从所选数据文件中读取数据然后运行分析模型。但由于我只对Node.js有非常基本的了解,所以目前只有当我打开以下链接“localhost:3000 / vis / rio”时,r代码才能运行。所以我的问题是如何让node.js在选择数据文件时自动在后台运行R代码。非常感谢您的帮助。

以下是我的代码:

Javascript-(将文件名发送到node.js):

var dataset,availableTags;
    function handleFileSelect(evt) {
      var file = evt.target.files[0];
      $.ajax({            //getting the file name and update to node.js
         type:'post',  
         url:"/getFileName",  
         data:{filename:file.name}
      }); 
      Papa.parse(file, {     //papa is a library I used to read csv file
        header: true,
        dynamicTyping: true,
        complete: function(results) {
        dataset=results.data;
        }
      });
    }

    $(document).ready(function(){
      $("#csv-file").change(handleFileSelect);
    });

Node.js脚本:        serve.js:

var express=require('express');
var path = require('path');
var vis = require('./routes/vis');
var index = require('./routes/index');
var bodyParser=require('body-parser');
var app=express();
require('./routes/main')(app);
app.get('/vis/rio',vis.rio);       **//this is a package used to get connection with Rserve**
app.set('views',__dirname + '/views');
app.set('view engine', 'ejs');
app.engine('html', require('ejs').renderFile);
app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.urlencoded());              
app.post("/getFileName",index.getFileName);    **//this is the script to get the file name, it is from index.js** 
var server=app.listen(3000,function(){
console.log("Express is running on port 3000");
});

index.js //这是获取文件名的js文件

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});

getFileName=function (req,res){
    global.filename=req.body.filename; **//this is the global variable which stores the file name**
    res.send('true');
};

module.exports = {router:router,getFileName:getFileName};

vis.js //这是用于连接Rserve并将名称传递给R代码的文件

var rio = require("rio");
var arg={};

exports.rio = function(req, res){
    arg={names:[global.filename]};
    console.log(arg);
     options = {
        entryPoint:"nameoffile",
        data: arg,
        host : "127.0.0.1",
        port : 6311,
        callback: function (err, val) {
            if (!err) {
                 console.log("RETURN:"+val);
                 return res.send({'success':true,'res':val});
            } else {
                 console.log("ERROR:Rserve call failed")
                 return res.send({'success':false});
            }
        },
    }
    rio.enableDebug(true);
    rio.sourceAndEval(__dirname + "/Rcode/test.R",options);
};

1 个答案:

答案 0 :(得分:0)

在您拨打服务器的任何时候,您似乎都没有呼叫/ vis / rio。

您需要在客户端对/ vis / rio进行第二次调用,或者如果您想使用该部分,您可以在index.js中导入/要求该模块并将其包含在getFileName和在返回文件之前,只需调用函数。我对rio并不是很熟悉,但我没有在您的代码中看到该功能的任何访问点。

编辑:如果我了解您正在尝试正确执行的操作,您可以随时在第一次ajax调用的成功回调中发出第二个请求(到/ vis / rio)。