2016-07-27 25 views
0

我已經使用express(WebStorm default)設置了一個基本的Node.js服務器,並試圖根據請求(從卵石手錶)運行python腳本,並且發送返回的json形式:使用Node.js發送簡單數據的正確方法

{"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; 
+0

什麼版本的快車您使用的是? –

回答

0

來看,您似乎與異步執行的麻煩。

在觸發end事件之前,您的函數run_py_script(data)不會返回最終值。然後,您將能夠將響應返回給用戶。
這裏有兩種可能的解決方案:

  1. 回調
  2. 承諾

我會使用一個回調

首先進行的方法,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); 
}); 
+0

謝謝你這麼多,它完美的工作 – Tardis50

相關問題