节点和/或npm问题

bla*_*amb 2 node.js npm deployd

我有一些npm包的各种权限和路径问题,这次是deployd的dpd二进制文件.然而,它似乎仍然与我偶尔收到的任何其他熟悉的令人沮丧的npm路径问题有关.考虑到我经常使用-g而不是在安装npm包时,它似乎非常熟悉npm的用法.

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

当从linux运行时,以下$ dpd启动deployd v0.8.4 ...无法启动MongoDB(确保'mongod'在$ PATH中或使用dpd --modod选项.参考: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
Run Code Online (Sandbox Code Playgroud)

即使我运行它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
Run Code Online (Sandbox Code Playgroud)

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

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

我在这做错了什么?

我找不到这个文件,也没有找到这行代码,child_process.js:1162 throw errnoException(err,'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');   }
Run Code Online (Sandbox Code Playgroud)

这是某种疯狂的权限错误吗?我认为我将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
Run Code Online (Sandbox Code Playgroud)

bla*_*amb 7

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

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

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

解析度:


如果您安装dpd或npm sudo,或者以其他方式产生了一些权限问题,这是修复权限的命令,并使用对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.
Run Code Online (Sandbox Code Playgroud)

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

c:/ #> net use x: \\hostname\\share
c:/ #> x:
x:/ #> cd ~/yourprojectdir/deploydSite
x:/yourprojectdir/deploydSite #> dpd -d
Run Code Online (Sandbox Code Playgroud)

这个确切的设置可能不适合你,但它给你的想法,当你安装dpd作为-g或sudo时松散权限.

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

我们什么时候,什么时候不在全球安装npm包?这取决于您的应用程序需求和经验水平.

有些时候我们需要全局安装npm软件包sudo npm -g,即将节点模块添加到/root/.node_modules和/或linux文件系统的上层目录中,以便在root permissed/pwned $ PATH上进行全局可用性,这是某个地方在/ usr/bin/node_modules附近.

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

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

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

一些非全局时间也可以存在:即当我们希望npm包安装时不是全局的.

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

2)或者我们可能希望使用我们的应用程序部署模块(通常是为了生产需要,以确保软件包将在应用程序的保质期内存在),因此我们将它们安装在与我们的应用程序相同的目录中,以便他们可以成为回购的一部分,再次不使用该-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
Run Code Online (Sandbox Code Playgroud)

所以在这里我们需要确保我们的路径以某种方式附加到它上面, /usr/bin; /usr/bin/node_modules/bin/bin; 如你所见,因为这是我们需要从我们的app或命令行引用我们的包bin/modules的地方.

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

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

NODE_MODULES=/usr/bin/bode_modules/bin/bin:/usr/bin
export PATH=<someadditionalpath-maybe-any-currentexistingones>:$NODE_MODULES:$PATH
Run Code Online (Sandbox Code Playgroud)

请注意symfony/assetic用户,请确保将资产路径更新为上述新发现.

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