3

私はjavascriptで通常のTCPソケットを実行しており、ノードを使用して実行しています。クライアントに応答を返す前に、いくつかの php (mysql) コードを使用してデータを検証したいと考えています。この JavaScript ファイル内でこのコードを実行するにはどうすればよいですか? STACKOVERFLOW の同様の質問はすべて、HTML のこのコードについて尋ねます。(それは大丈夫です。その部分は理解しています)が、これは通常のjavascriptファイルです(ノードで実行されます)。JavaScript コードは以下のとおりで、検証関数呼び出しをマークしました。

var net = require('net');

var HOST = '192.168.0.6';
var PORT = 8765;

net.createServer(function(sock) {

    console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);

    sock.on('data', function(data) {
        var output;
        var validScan;

        //This is the function call to a php file
        **validScan = validateScanTag(data);**

        console.log('DATA ' + sock.remoteAddress + ': ' + data);
        sock.write(validScan);

    });

    // Closing this instance of socket
    sock.on('close', function(data) {
        console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
    });

}).listen(PORT, HOST);

console.log('Server listening on ' + HOST +':'+ PORT);

validateScanTag は次の行 lke を実行します。

$.post('getperiod.php', {hours:hrs, minutes:mins, seconds:secs, ddd:day},

しかし、これはうまくいきません。javascript ファイルからこの「geteriod.php」ファイルを呼び出すにはどうすればよいですか?

4

3 に答える 3

1

問題自体は再考する価値があると確信していますが (たとえば、mysql コードを php からノードに移植するなど)、私の解決策は次のとおりです。

var net = require('net');
var PORT = 8765;
var Lazy=require('lazy');
var spawn = require('child_process').spawn;

// php code runs as a server in external process

var validator = spawn('php', ['validator.php']);

net.createServer(function(sock) {

    console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);

    // on 'data' handler is not enough to read input line by line
    // you need to buffer data, use some kind of state machine or one of available stream parsers. I use lazy here: npm install lazy

    // write each line to php validation code
    new Lazy(sock).lines.forEach(function(line) {
        console.log('DATA ' + sock.remoteAddress + ': ' + line.toString());
        validator.stdin.write(line);
        validator.stdin.write('\n');
    });

    // read validation result line by line from validator process
    new Lazy(validator.stdout).lines.forEach(function(line) {
        console.log('Validation result:' + line.toString()) // line is Buffer object here, hence toString
    });

    validator.stdout.pipe(process.stdout);

    // Closing this instance of socket
    sock.on('close', function() {
        console.log('CLOSED');
    });

}).listen(PORT);

validator.php は stdin から読み取り、stdout に書き込む必要があります

<?

function validatescanTag($l) {
    // put your validation code here
    return $l . '!!!!';
}

$stdin = fopen('php://stdin', 'r');

do {
  $line = fgets($stdin);
  print validateScanTag($line);
} while(1);

?>

もう 1 つのオプションは、node <-> php またはdnode rpcと通信するためにfastcgi プロトコルを使用することです。または、http を使用して、nginx/apache (またはnode-php )から php を実行します。

于 2012-10-23T09:53:24.593 に答える
0

明確化と「ブーツに乗る」ためのより一般的な答えを与えるアプローチ:

私が理解している限り、node.js サーバーによって呼び出された http 投稿要求を使用して、php スクリプトを実行しようとしています。

通常、サーバーサイド JavaScript を実行すると、ブラウザー内で JS を実行する場合とは異なる動機と可能性、およびアーキテクチャへの影響があるという事実を最初に認識しておく必要があります (少なくとも古典的な「jQuery の意味」では)。

コメントで述べたように、jQuery はサーバー側の node.js 内でシームレスに動作することが期待されます。コメント投稿が示すように、それは機能しませんReferenceError: $ is not defined。node.js スタックですぐに使用できるサーバー側の jQuery はありません (サーバー側で jQuery を使用する可能性については個別に説明する必要があり、別のテーマです)。

それにもかかわらず、サーバー側で使用することにより、mysql データ接続と処理を既に処理している PHP スクリプトを再利用する方法を明らかに探しています。http を使用してこれを行うと、このスタックオーバーフローの投稿またはnode.js ドキュメントの http.request セクションに示されているような可能性があります。php スクリプトが node.js が実行されているのと同じサーバー (またはより良いランタイム環境) にある場合は、php スタンドアロン (コマンドライン) ユーティリティを使用して子プロセスとして生成することにより、php スクリプトを直接実行することもできます。

最後になりましたが、はい、mysql を node.js アプリに直接接続する方法がいくつかあります (npm モジュール、ORM レイヤー)。しかし、それは別の複雑な問題であり、他の場所で議論されています.

混同してはいけないものを混同しないようにするのに役立つことを願っています。

于 2012-10-23T10:18:38.803 に答える