使用Node.js

时间:2016-07-27 12:50:13

标签: javascript node.js pebble-js

我已经使用express(WebStorm默认设置)设置了一个基本的Node.js服务器,并且已经尝试根据请求(来自pebble watch)来运行python脚本,并以下列形式发送返回的json: p>

{"willCollide": 1, "time": 6000, "strength": "NA"}

回到手表。我刚刚开始研究JavaScript,因此只有很少的经验,并且我希望我做错了大部分。 目前我遇到了一个"错误:发送后无法设置标头"并且想知道在请求时将json发送给用户的正确方法是什么? 我也想知道这是否确实是将数据从python脚本发送到Pebble手表的最佳方法。 下面是请求中调用的JavaScript文件中的代码:

var express = require('express');
var router = express.Router();
var PythonShell = require('python-shell');

var options = {
    mode: 'json'
};

var rain_data;

function run_py_script(data){

    var pyshell = new PythonShell('dummy.py', options);
    var ret_val;
    /* Dummy data doesnt matter atm */
    pyshell.send("dummy data"); // change to data

    pyshell.on('message', function(message){
        console.log(message);
        ret_val = message;
        console.log(message["willCollide"]); // debug check
    });

    pyshell.end(function(err){
        if (err) {
            console.log('error received from python script');
        }
        console.log('finished script');
    });

    return ret_val;
}

/* GET rain_track data. */

router.get('/', function(req, res, next) {

    rain_data = run_py_script(null);

    res.write(rain_data);
    res.end();
});

module.exports = router;

1 个答案:

答案 0 :(得分:0)

似乎你在异步执行方面遇到了麻烦。

run_py_script(data)事件被触发之前,您的函数end不会返回最终值。然后,您将能够将响应返回给用户 这里有两种可能的解决方案:

  1. 回调
  2. 承诺
  3. 我将使用回调

    进行处理

    首先,run_py_script将有2个参数data和一个用响应调用的函数,我们称之为cb。最终将使用最终数据调用cb

    function run_py_script(data, cb) {
      // I'm going to summarize this code 
      var ret_val;
    
      pyshell.on('message', function(message){ 
        ret_val = message; 
      });
    
      pyshell.end(function(err){ 
         return err ? cb(null) : cb(ret_val);
      });
    
      // note there is no return statement
    }
    

    现在,让我们创建你的控制器:

    router.get('/', function(req, res, next) {
        run_py_script(null, function(rain_data) {
          res.json(rain_data); // same as write().end() but more elegant
        });
    });
    

    最终奖金: cb的节点约定是2参数函数;第一个参数用作错误,null一切正常,第二个参数是数据本身,如果错误将是null

    考虑到这一点,最终的代码将是(总结)

    function run_py_script(data, cb) {
      // ...
      pyshell.end(function(err){
        return err ? cb(err, null) : cb(null, ret_val);
      });
    } 
    run_py_script(null, function(err, rain_data){ 
      if (err){ return res.json(null); }
      return res.json(data);
    });