Я запускаю обычный TCP-сокет в javascript и использует узел для выполнения. Прежде чем отправить ответ клиенту, я хочу проверить данные с некоторым кодом 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},
Но это не работает. Как я могу назвать этот файл 'geteriod.php' из файла javascript?
Я уверен, что сама проблема стоит переосмыслить (например, переносить ваш код 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); ?>
Другой вариант – использовать протокол fastcgi для связи узла <-> php или dnode rpc . Или просто используйте http и запустите php из nginx / apache (или даже node-php )
Подход, чтобы дать более общий ответ для разъяснения и «получить вас на сапогах»:
Насколько я понимаю, вы пытаетесь запустить ваш php-скрипт, используя HTTP-запрос, вызываемый сервером node.js.
Вероятно, вам сначала нужно узнать о том, что работающий серверный JavaScript обычно имеет разные мотивации и возможности, а также влияет на вашу архитектуру, а не на запуск JS внутри браузера – по крайней мере, в классическом «смысле jQuery».
Как указано в вашем комментарии, вы ожидаете, что jQuery будет работать без сбоев на стороне сервера node.js. Это не работает, поскольку отмеченный комментарием ReferenceError: $ is not defined
показывает вас. В вашем стеке node.js нет готового jQuery на стороне сервера (возможности использования серверной стороны jQuery должны обсуждаться отдельно и это еще одна тема).
Тем не менее, вы, очевидно, ищете способ повторного использования своего PHP-скрипта, который уже обрабатывает соединение и обработку данных mysql, используя его на стороне сервера . Выполнение этого с использованием http возможно, как показано в этой статье stackoverflow или в разделе http.request документации node.js. Если ваш php-скрипт находится на том же сервере (или улучшенной среде выполнения) по мере запуска вашего узла.js, вы также можете напрямую выполнить скрипт php , создав его как дочерний процесс с помощью утилиты php standalone (командной строки).
И последнее, но не менее важное: Да, есть некоторые способы (модули npm, уровни ORM) для непосредственного подключения mysql с вашим приложением node.js. Но это еще один сложный вопрос и обсуждается в других местах.
Надеюсь, что это помогло избежать смешивания вещей, которые нельзя смешивать.
Существует PHP-расширение, встраивающее движок V8 Chrome в PHP.