node.js无法使用PHP Mink找到模块'zombie' [英] nodejs cannot find module 'zombie' with PHP mink

查看:121
本文介绍了node.js无法使用PHP Mink找到模块'zombie'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Ubuntu上尝试 Mink(PHP) 14.04;我基本上做了以下事情:

I'm trying out Mink (PHP) on Ubuntu 14.04; I basically did the following:

$ apt-show-versions nodejs
nodejs:amd64/trusty 0.10.45-1nodesource1~trusty1 uptodate
$ npm -v
2.15.1
$ sudo npm install -g zombie
npm WARN engine zombie@4.2.1: wanted: {"node":"^4.0.0"} (current: {"node":"0.10.45","npm":"2.15.1"})
...
zombie@4.2.1 /usr/lib/node_modules/zombie
├── ms@0.7.1
├── debug@2.2.0
...

$ ls /usr/lib/node_modules/zombie/node_modules/
babel-runtime  bluebird  debug  eventsource  iconv-lite  jsdom  lodash  mime  ms  request  tough-cookie  ws

因此,基本上,即使我得到警告,模块也会构建,并且应该位于目录/usr/lib/node_modules中.

So, basically, even if I get a warning, the modules build, and should be in the directory /usr/lib/node_modules.

然后我这样做:

mkdir test_php_mink
cd test_php_mink/
composer require behat/mink
composer require behat/mink-zombie-driver

作为支票:

test_php_mink$ ls
composer.json  composer.lock  vendor

...似乎所有composer文件都在那里.

... it seems all composer files are there.

最后,按照 http://mink.behat.org/en /latest/drivers/zombie.html (还有找不到模块'zombie'·问题#84·assaf/zombie·GitHub ),我正在尝试以下脚本:

Finally, as per http://mink.behat.org/en/latest/drivers/zombie.html (and also Cannot find module 'zombie' · Issue #84 · assaf/zombie · GitHub), I'm trying this script:

<?php

# composer autoload:
require_once __DIR__ . '/vendor/autoload.php';

echo "safe_mode: '" . ini_get("safe_mode") ."'\n"; # have PHP 5.5.9, safe_mode is removed

putenv("NODE_PATH=/usr/lib/node_modules");
echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; # OK, is there

# NOPE:
#$driver = new \Behat\Mink\Driver\ZombieDriver();

$driver = new \Behat\Mink\Driver\ZombieDriver(
  new \Behat\Mink\Driver\NodeJS\Server\ZombieServer()
);

$session = new \Behat\Mink\Session($driver);

// start the session
$session->start();
?>

不幸的是,该脚本仍然失败,并显示以下内容:

This script, unfortunately, still fails with:

$ php test_php_mink.php 
safe_mode: ''
NODE_PATH is: '/usr/lib/node_modules'
PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'Server process has been terminated: (8) [
module.js:340
    throw err;
          ^
Error: Cannot find module 'zombie'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/path/to/test_php_mink/vendor/behat/mink-zombie-driver/bin/mink-zombie-server.js:3:14)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
]' in /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php:413
Stack trace:
#0 /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php(306): Behat\Mink\Driv in /path/to/test_php_mink/vendor/behat/mink-zombie-driver/src/NodeJS/Server.php on line 413

如何运行此基本示例?

玩了一点,发现当我在命令行上指定环境变量时:

Played around a bit more with this, and discovered that when I specify the environment variable on the command line:

$ NODE_PATH=/usr/lib/node_modules php test_php_mink.php
safe_mode: ''
NODE_PATH is: '/usr/lib/node_modules'
PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'Server process has been terminated: (8) [
/usr/lib/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:238
var nonInheritedTags = new Set([
                           ^
ReferenceError: Set is not defined
...

...然后似乎找到了该模块!所以我的问题基本上可以归结为:如何从我的php脚本中更改NODE_PATH环境变量,所以我不必在shell上指定它-因为显然putenv("NODE_PATH=/usr/lib/node_modules");对我来说真的不起作用...

... then the module seems to be found! So my question basically reduces to: how can I change the NODE_PATH environment variable from my php script, so I wouldn't have to specify it on the shell - since apparently putenv("NODE_PATH=/usr/lib/node_modules"); does not really work for me...

对于新错误,存在)的版本不匹配所致,所以我想我必须安装nvm以便安装正确的nodejs.版本;而且我在/usr/lib/node_modules/zombie/README.md中也注意到了:

As for the new error, there is Installing Zombie.js Error: ReferenceError: Set is not defined. What am I doing wrong? - apparently this is due to the version mismatch that I got a warning for (npm WARN engine zombie@4.2.1: wanted: {"node":"^4.0.0"} (current: {"node":"0.10.45","npm":"2.15.1"})), so I guess I'll have to install nvm so I can install the right nodejs version; and I also noticed in /usr/lib/node_modules/zombie/README.md:

Zombie 4.x 已通过测试,可与 io.js 1.6或稍后.
如果需要使用Node 0.12或更早版本,请考虑使用Zombie2.x. ...
要安装Zombie.js,您需要 io.js :
bash
$ npm install zombie --save-dev
```

Zombie 4.x is tested to work with io.js 1.6 or later.
If you need to use Node 0.12 or earlier, consider using Zombie 2.x. ...
To install Zombie.js you will need io.js:
```bash
$ npm install zombie --save-dev
```

...,我认为也可以通过nvm安装;所以我尝试一下...

... and I think that can also be installed with nvm; so I'll give that a try...

推荐答案

好吧,发现了某种看似可行的方法-但我仍希望有人能提供更多知识.

Ok, found some sort of a method which seemingly works - but I'd still like someone more knowledgeable to answer.

无论如何,诀窍是-zombie可以接受nodejs二进制文件的路径;因此,如果您不能真正从PHP传递nodejs的环境变量,请制作一个将设置这些环境变量的shell脚本,然后调用nodejs.

Anyways, the trick is - zombie can accept a path to the nodejs binary; so if you cannot really pass environment variables for nodejs from PHP, then make a shell script which will set these environment variables, and then call nodejs.

首先这是我的安装

# remove previous
sudo npm uninstall -g zombie --save-dev
sudo apt-get remove --purge nodejs && sudo apt-get autoremove --purge

# install new
curl -o- https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
nvm install iojs-v3.3.1
npm list -g --depth=0
nvm install 4.0.0
npm list -g --depth=0
npm -g install zombie --save-dev

nvm的问题在于它安装在用户目录中,并且我想在用户机器和远程服务器(它们的uid完全不同)上测试脚本.无论如何,使用自定义可执行文件都会有所帮助.因此,在全局"位置创建脚本,我选择了/home,所以我需要sudo才能在此处创建文件:

The problem with nvm is that it installs in a user directory, and I'd like to test my scripts both on my user machine and remote server, where my uids are completely different. Regardless, using a custom executable helps a bit with that. So, create a script in a "global" location, I chose /home, so I'll need sudo to create files there:

sudo touch /home/node_pth.sh

...然后粘贴以下内容:

... then paste in the following content:

#!/bin/bash
export NODE_PATH=/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules
#echo ARGS ARE "$@" | tee -a /tmp/node.log
/home/USERNAME/.nvm/versions/node/v4.0.0/bin/node "$@"

...当然,用正确的路径替换路径;然后最终使其可执行:

... of course, replacing the paths with your correct ones; then finally make it executable:

sudo chmod +x /home/node_pth.sh

现在我们可以使用以下test_php_mink.php PHP文件:

Now we can use the following test_php_mink.php PHP file:

<?php

$nodeModPath = "/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules"; # correct NODE_PATH, but will not help
$nodePath = "/home/node_pth.sh"; # shell script that sets NODE_PATH, then calls node executable

echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; #
putenv("NODE_PATH=".$nodeModPath);
echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; # is there - but still doesn't help with call

# composer autoload:
require_once __DIR__ . '/vendor/autoload.php';

echo "safe_mode: '" . ini_get("safe_mode") ."'\n"; # have PHP 5.5.9, safe_mode is removed


$driver = new \Behat\Mink\Driver\ZombieDriver(
  //~ new \Behat\Mink\Driver\NodeJS\Server\ZombieServer()
  # copy defaults here for everything but nodeBin;
  # see vendor/behat/mink-zombie-driver/src/NodeJS/Server.php
  new \Behat\Mink\Driver\NodeJS\Server\ZombieServer("127.0.0.1", 8124, $nodePath, null)
);

$session = new \Behat\Mink\Session($driver);

// start the session
$session->start();
?>


...或者,我刚刚意识到vendor/behat/mink-zombie-driver/src/NodeJS/Server.php中有setNodeModulesPath($nodeModulesPath),因此我们可以完全删除代理bash可执行文件:


... OR, I just realized there is setNodeModulesPath($nodeModulesPath) in vendor/behat/mink-zombie-driver/src/NodeJS/Server.php, so we can drop the proxy bash executable altogether:

<?php

$nodeModPath = "/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules"; # correct NODE_PATH, but will not help via putenv

echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; #
putenv("NODE_PATH=".$nodeModPath);
echo "NODE_PATH is: '" . getenv ( "NODE_PATH" ) . "'\n"; # is there - but still doesn't help with call

# composer autoload:
require_once __DIR__ . '/vendor/autoload.php';

echo "safe_mode: '" . ini_get("safe_mode") ."'\n"; # have PHP 5.5.9, safe_mode is removed

$zsrv = new \Behat\Mink\Driver\NodeJS\Server\ZombieServer();
$zsrv->setNodeModulesPath($nodeModPath . "/"); # needs to end with a trailing '/'

$driver = new \Behat\Mink\Driver\ZombieDriver( $zsrv );

$session = new \Behat\Mink\Session($driver);

// start the session
$session->start();

?>

无论如何,调用此脚本时,它会输出:

Anyways, when this script is called, it outputs:

$ php test_php_mink.php
NODE_PATH is: ''
NODE_PATH is: '/home/USERNAME/.nvm/versions/node/v4.0.0/lib/node_modules'
safe_mode: ''

...由于没有错误,我认为现在一切都很好...

... and as there are no errors, I'm assuming it is all fine now...

这篇关于node.js无法使用PHP Mink找到模块'zombie'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆