簡體   English   中英

child_process.fork-process.send不返回消息

[英]child_process.fork - process.send does not return message

我正在使用節點child_process.fork api運行此腳本。

那是我的快速應用程序腳本,從這里啟動我的應用程序:

/**
 * Module dependencies.
 */
var express = require('express')
, routes = require('./routes')
, http = require('http')
, path = require('path');

var app = express();

//database connection
var connection  = require('express-myconnection'); 
var mysql = require('mysql');
//all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.static(path.join(__dirname, 'public')));

//development only
if ('development' == app.get('env')) {
    app.use(express.errorHandler());
}


app.use(
        connection(mysql,{
            host: 'localhost',
            user: 'root',
            password : '',
            port : 3306, //port mysql
            database:'test-db'
        },'pool')
);

//routes
//app.get('/', routes.index);
app.get('/', routes.list);
app.use(app.router);

//run script
var cp = require('child_process');
var child = cp.fork('dataGrabber/pusherMysql');

child.on('message', function(m) {
    // Receive results from child process
    console.log('received: ' + m);
});

http.createServer(app).listen(app.get('port'), function(){
    console.log('Express server listening on port ' + app.get('port') + ' http://localhost:' + app.get('port'));
});

那就是我運行腳本的部分:

//run script
var cp = require('child_process');
var child = cp.fork('dataGrabber/pusherAPI');

child.on('message', function(m) {
    // Receive results from child process
    console.log('received: ' + m);
});

如您所見,我加載了腳本並希望收到孩子的消息。

那是我的pusherAPI.js腳本:

var mysql  = require('mysql');
var Pusher = require('pusher-client');

/**
 * connect with mysql db
 */
var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    database : 'test-db',
    port     : '3306',
    password : ''
});

connection.connect(function(err) {
    if (err) {
        console.error('error connecting: ' + err.stack);
        return;
    }

    console.log('connected as id ' + connection.threadId);
});

//connect with the server
var API_KEY = 'cb65d0a7a72cd94adf1f';
var pusher = new Pusher(API_KEY, {
    encrypted: true
}); 

var channel = pusher.subscribe("ticker.160");
channel.bind("message", function(data) {
    console.log(data);
    this.data = data;

    /**
     * save data to db
     */
    var trade  = {
            timestamp           : data.trade.timestamp,
            price               : data.trade.topbuy.price, 
    };

    var query = connection.query('INSERT INTO trades SET ?', trade, function(err, result) {
        if (err) { 
            connection.rollback(function() {
                throw err;
            });
        }  

        //push message back to the app.js
        process.on('message', function(m) {
//          Pass results back to parent process
            m = "insert happened";
            process.send(m);
        });

        connection.commit(function(err) {
            if (err) { 
                connection.rollback(function() {
                    throw err;
                });
            }
        });
    });
    console.log(query.sql); 
});

每當我的sql db發生插入時,我都想將消息發送回我的app.js

我的腳本啟動並運行我的查詢。 但是, process.send(m); 不發回任何東西。

有什么建議我做錯了嗎?

感謝您的回答!

更新

將我的pusherAPI.js更改pusherAPI.js ,控制台中什么也沒有恢復。

var channel = pusher.subscribe("ticker.160");
process.on('insert_message', function(m) {
channel.bind("message", function(data) {
        console.log(data);
        this.data = data;

        /**
         * save data to db
         */
        var trade  = {
                timestamp           : data.trade.timestamp,
                price               : data.trade.topbuy.price, 
        };

        var query = connection.query('INSERT INTO trades SET ?', trade, function(err, result) {
            if (err) { 
                connection.rollback(function() {
                    throw err;
                });
            }  

            //push message back to the app.js
    //          Pass results back to parent process
                m = "insert happened";
                process.send(m);


            connection.commit(function(err) {
                if (err) { 
                    connection.rollback(function() {
                        throw err;
                    });
                }
            });
        });
        console.log(query.sql); 
    });
});

在我的app.js我像這樣更改了代碼:

//run script
var cp = require('child_process');
var child = cp.fork('dataGrabber/pusherAPI');

child.on('insert_message', function(m) {
    // Receive results from child process
    console.log('received: ' + m);
});

移動您的process.send(m); message事件處理程序之外。 否則,您將為每個查詢添加新的message事件處理程序,並且這些事件處理程序僅在父進程向其發送消息時才觸發。 例:

var channel = pusher.subscribe("ticker.160");
channel.bind("message", function(data) {
    this.data = data;

    /**
     * save data to db
     */
    var trade  = {
      timestamp           : data.trade.timestamp,
      price               : data.trade.topbuy.price, 
    };
    var query = connection.query('INSERT INTO trades SET ?',
                                 trade,
                                 function(err, result) {
      if (err) { 
        connection.rollback(function() {
          throw err;
        });
        return;
      }  

      //push message back to the app.js
      m = "insert happened";
      process.send(m);

      connection.commit(function(err) {
        if (err) { 
          connection.rollback(function() {
            throw err;
          });
        }
      });
    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM