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 应该从标准输入读取并写入标准输出

<?

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

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

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

?>

另一种选择是使用fastcgi 协议与 node <-> php 或dnode rpc通信。或者只是使用 http 并从 nginx/apache (甚至node-php)运行 php

于 2012-10-23T09:53:24.593 回答
0

一种为澄清和“让你穿上靴子”给出更通用答案的方法:

据我了解,您正在尝试使用 node.js 服务器调用的 http post 请求运行您的 php 脚本。

您可能首先必须意识到,与在浏览器中运行 JS 相比,运行服务器端 JavaScript 通常具有不同的动机和可能性以及对架构的影响——至少在经典的“jQuery 意义上”。

如您的评论中所述,您希望 jQuery 在服务器端 node.js 中无缝工作。正如评论发布的那样,这不起作用ReferenceError: $ is not defined。您的 node.js 堆栈中没有开箱即用的服务器端 jQuery(使用 jQuery 服务器端的可能性应单独讨论,是另一个主题)。

尽管如此,您显然正在寻找一种方法来重用您的 PHP 脚本,该脚本已经处理了您的 mysql 数据连接并通过利用它来处理服务器端使用 http执行此操作有可能出现在此 stackoverflow 帖子node.js 文档的 http.request 部分中。如果您的 php 脚本与 node.js 运行在同一台服务器(或更好的运行时环境)上,您也可以通过使用 php 独立(命令行)实用程序将其作为子进程生成来直接执行 php 脚本。

最后但同样重要的是:是的,有一些方法(npm 模块、ORM 层)可以将 mysql 直接与您的 node.js 应用程序连接起来。但这是另一个复杂的主题,在其他地方进行了讨论。

我希望这有助于避免混淆不应该混淆的事情。

于 2012-10-23T10:18:38.803 回答
0

有一个 PHP 扩展在 PHP 中嵌入了 Chrome 的 V8 引擎

于 2013-09-01T13:58:32.127 回答