2016-07-27 3 views
0

express(WebStormのデフォルト)を使用してBasic Node.jsサーバーをセットアップし、Pythonスクリプトを実行するために要求に応じて(pebble watchから)作成しようとしました。返された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

あなたは非同期実行に問題を抱えているようです。

run_py_script(data)は、endイベントが発生するまで最終値を返しません。その後、応答をユーザーに返すことができます。ここ
あなたは2つの解決策があります。

  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、すべてがOK、2番目の引数がエラーの場合は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

関連する問題