【问题标题】:Correct method to send simple data using Node.js使用 Node.js 发送简单数据的正确方法
【发布时间】:2016-07-27 12:50:12
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是什么版本的 Express?

标签: javascript node.js pebble-js


【解决方案1】:

您似乎在异步执行方面遇到了问题。

直到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);
});

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2017-06-26
    • 2019-12-03
    • 1970-01-01
    • 2019-04-30
    • 2022-11-28
    相关资源
    最近更新 更多