节点和/或npm问题

时间:2015-08-05 08:01:28

标签: node.js npm deployd

我对某些npm软件包有各种许可和/或路径问题,这次是deployd的dpd二进制文件。然而,它似乎仍然与我偶尔收到的任何其他熟悉的令人沮丧的npm路径问题有关。由于我不断使用-g,而且在安装npm包时没有使用npm,这几乎是熟悉的npm用法。

到目前为止,为了解决这个问题,我尝试了多次从用户和全局重新安装deployd和mongodb,我甚至重新安装了npm。我在运行dpd时获得一致的包错误。我发现很多相关的,但没有一个有效。这是今天运行dpd时的问题。有什么大建议吗?

从linux运行时我的以下内容     $ dpd     启动deployd v0.8.4 ...     无法启动MongoDB(确保'mongod'在$ PATH中或使用dpd --mongod选项.Ref:http://docs.deployd.com/docs/basics/cli.html)     再见

$ sudo dpd
starting deployd v0.8.4...
Failed to start MongoDB (Make sure 'mongod' are in your $PATH or use dpd --mongod option. Ref: http://docs.deployd.com/docs/basics/cli.html)
bye

    $ dpd --mongod ./.dpd/pids
    starting deployd v0.8.4...
    child_process.js:1162
        throw errnoException(err, 'spawn');
              ^
    Error: spawn EACCES
        at exports._errnoException (util.js:746:11)
        at ChildProcess.spawn (child_process.js:1162:11)
        at exports.spawn (child_process.js:995:9)
        at Object.exports.restart (/usr/bin/node_modules/bin/lib/node_modules/deployd/lib/util/mongod.js:38:14)
        at start (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:149:16)
        at Object.<anonymous> (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:280:31)
        at Module._compile (module.js:460:26)
        at Object.Module._extensions..js (module.js:478:10)
        at Module.load (module.js:355:32)
        at Function.Module._load (module.js:310:12)
        at Function.Module.runMain (module.js:501:10)
        at startup (node.js:129:16)
        at node.js:814:3

即使我运行它sudo我也得到同样的错误。

$ sudo dpd --mongod ./.dpd/pids
starting deployd v0.8.4...
child_process.js:1162
    throw errnoException(err, 'spawn');
          ^
Error: spawn EACCES
    at exports._errnoException (util.js:746:11)
    at ChildProcess.spawn (child_process.js:1162:11)
    at exports.spawn (child_process.js:995:9)
    at Object.exports.restart (/usr/bin/node_modules/bin/lib/node_modules/deployd/lib/util/mongod.js:38:14)
    at start (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:149:16)
    at Object.<anonymous> (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:280:31)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3

当从samba共享映射网络驱动器上的Windows运行时,我得到了这个

dpd > fs: missing callback Error: EPERM, open 'C:\Program Files (x86)\Deployd\node_modules\deployd\.latestversion'

我在这里做错了什么?

我找不到这个文件,也找不到这行代码, child_process.js:1162         throw errnoException(错误,'spawn'); 当我为它grep时,一个引用确实会出现代码行,即/ bin / node,当我在vim中打开它时,它看起来是加密的...我认为看起来生病了,那条线可能就在那里。 ..嗯。

好吧我确实在节点二进制文件中找到了这一行,

this.spawnfile = options.file;

  var err = this._handle.spawn(options);

  // Run-time errors should emit an error, not throw an exception.   if (err === uv.UV_EAGAIN ||
      err === uv.UV_EMFILE ||
      err === uv.UV_ENFILE ||
      err === uv.UV_ENOENT) {
    process.nextTick(function() {
      self._handle.onexit(err);
    });
    // There is no point in continuing when we've hit EMFILE or ENFILE
    // because we won't be able to set up the stdio file descriptors.
    // It's kind of silly that the de facto spec for ENOENT (the test suite)
    // mandates that stdio _is_ set up, even if there is no process on the
    // receiving end, but it is what it is.
    if (err !== uv.UV_ENOENT) return err;   } else if (err) {
    // Close all opened fds on error
    stdio.forEach(function(stdio) {
      if (stdio.type === 'pipe') {
        stdio.handle.close();
      }
    });

    this._handle.close();
    this._handle = null;
    throw errnoException(err, 'spawn');   }

这是某种疯狂的权限错误吗?我认为我将755设置为所有文件,dirs以用户身份运行..没有安装selinux,可能有一些设备......怀疑它,在这个目录..

我重新安装了npm和nodejs,并没有帮助。这是一个拱形linux盒子。

编辑:是的,由于某种原因,即使我通过更正权限问题解决了另一个问题,这也无法正常工作。

$ dpd -d --mongod /usr/bin/node_modules/bin/lib/node_modules
starting deployd v0.8.4...
deployd v0.8.5 is available.

child_process.js:1162
    throw errnoException(err, 'spawn');
          ^
Error: spawn EACCES
    at exports._errnoException (util.js:746:11)
    at ChildProcess.spawn (child_process.js:1162:11)
    at exports.spawn (child_process.js:995:9)
    at Object.exports.restart (/usr/bin/node_modules/bin/lib/node_modules/deployd/lib/util/mongod.js:38:14)
    at start (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:149:16)
    at Object.<anonymous> (/usr/bin/node_modules/bin/lib/node_modules/deployd/bin/dpd:280:31)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3

1 个答案:

答案 0 :(得分:7)

注意EACCESS,这意味着它是一个权限问题。 dpd的权限需要适当的运行访问权限。检查dpd二进制文件的权限,这是EACCESS错误的潜在原因。可能因为sudo npm -g像sudo一样运行,catch 22可能已经变成了自从作为sudo运行后,权限没有设置在dpd链的某个地方,甚至可能是符号链接本身,所以你需要手动转到二进制文件symlink在/ usr / bin / node_modules / bin / bin / pdp到/ lib / node_modules / deployd / bin并重置其中的权限。

然而,更深入的思考,可能是问题是由于dpd安装本身是从sudo运行的,因为npm可能已经为这个逻辑链添加了一个很好的错误输出。

此外,需要检查linux用户目录中.npm的权限,有些事情可能是以root用户身份完成的,或者是sudo在那里。您可能希望以递归方式将权限重置给用户。

分辨率:

如果您从sudo安装dpd或npm,或者以某种方式产生了一些权限问题,这是修复权限的命令,并使用对mongodb的引用启动deployd(如果需要):

$ chown <youruser>:<yourgroup> ~/.npm -R
$ cd /lib/node_modules/deployd/bin
$ sudo chown root:yourGroup dpd
$ sudo chmod g+rwx dpd
$ dpd -d --mongod .dpd/pids/mongod
    starting deployd v0.8.4...
    deployd v0.8.5 is available.

如果您从Windows运行deployd,则必须以管理员身份运行cmd提示符 如果您有映射的网络驱动器,当您以管理员身份运行时,您将无法访问此映射的网络驱动器。那时最简单的解决方案就是通过dos,

来映射它
c:/ #> net use x: \\hostname\\share
c:/ #> x:
x:/ #> cd ~/yourprojectdir/deploydSite
x:/yourprojectdir/deploydSite #> dpd -d

这个确切的设置可能不适合你,但它给你的想法是,当你将dpd安装为-g或sudo时,要放宽权限。

<强>预防;适当的npm包$ PATH用法

我们什么时候开始,什么时候不在全球范围内安装npm软件包?这取决于您的应用程序需求和经验水平。

有些时候我们需要全局安装npm软件包,即sudo npm -g,它将节点模块添加到/root/.node_modules和/或linux文件系统的上层目录中,以便在root用户上获得全局可用性/ pwned $ PATH,它位于/ usr / bin / node_modules附近。

例如,某些全球时代可以;

1)当我们任何人想要将全局模块添加到我们的用户站点项目目录时,在全局位置,不需要部署或部分应用程序repo(仅在开发时间使用npm包)< / p>

2)或者什么时候有权限问题而且只是这样做是因为它试图摔倒克服权限问题(通常不是一个好主意添加,并且会让你首先进入这个修复)

也可能存在一些非全球时代: 即当我们想要在全球范围内安装npm软件包时。

1)也许我们希望它们仅适用于我们所有的用户项目,希望保持我们的应用程序干净,在运行我们的appd时将使用它们〜/ .npm。哎呀,系统管理员甚至可能只允许我们这样做,以保护其他开发者的全球空间。例如:这意味着我们想要全局安装npm软件包,理想情况下将它们放入我们的〜/ .npm / node_modules $ PATH中,并且不使用-g选项。

2)或者我们可能希望使用我们的应用程序部署模块(通常用于生产需求,以确保软件包将在您的应用程序的保质期内存在),因此我们将它们安装在与我们相同的目录中应用程序,以便它们可以成为repo的一部分,再次不使用-g选项。

那么,我什么时候在全球范围内安装npm软件包?这取决于您的应用程序的需求和要求,或者开发需求,请参见上文。

- 计算任何所需的路径 安装完成后,您需要确保所有路径都可用。您将需要找到所有这些模块的位置。对于每个模块,查找它们,记录它们所在的所有目录,然后与您的路径交叉引用

$ echo $PATH 它可能会返回这样的东西 /usr/local/sbin:/usr/local/bin:/usr/bin/node_modules/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

$ which node
/usr/bin/node
$ which npm
/usr/bin/npm
$ which dpd
/usr/bin/node_modules/bin/bin/dpd
$ which less
/usr/bin/less
$ which uglifyjs
/usr/bin/uglifyjs

所以在这里我们需要确保我们的路径以某种方式附加了以下内容 /usr/bin; /usr/bin/node_modules/bin/bin; 正如您所看到的,因为这是我们的包箱/模块,我们需要从我们的应用程序或命令行引用。

您可以确保将这些内容添加到您的用户的一种方法$ PATH是通过编辑您的bashrc文件。

- 根据您的发行版相应地编辑您的bashrc .. vim ~/.bashrc

NODE_MODULES=/usr/bin/bode_modules/bin/bin:/usr/bin
export PATH=<someadditionalpath-maybe-any-currentexistingones>:$NODE_MODULES:$PATH

请注意symfony / assetic用户,请确保根据上述新发现更新资产路径。

与linux用户的新登录会话应该可以证明您在返回开发的过程中表现良好。您现在应该在路径上看到正确的路径项,然后当您以用户身份运行所有这些命令时,例如$ npm$ dpd,您应该看到没有错误,并且不必在前面附加./,例如./dpd -d./npm等.Dpd应该正常运行,您的应用程序,无论是资产还是其他任何东西,现在都可以正常访问这些模块。