【问题标题】:node and or npm issue节点和或 npm 问题
【发布时间】:2016-05-28 06:04:08
【问题描述】:

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

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

当从 linux 运行时,我如下 $ dpd 开始部署 v0.8.4... 无法启动 MongoDB(确保 'mongod' 在您的 $PATH 中或使用 dpd --mongod 选项。参考: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 抛出 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');   }

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

我重新安装了 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

【问题讨论】:

  • 您确定 ./.dpd/pid 是您的 mongo 安装所在的目录吗?你应该可以使用'sudo dpd -m /path/to/mongo'。
  • 是的,我发现了问题,见下文。
  • 另一件事我没有意识到,也没有文档,我没有通过 putty 为我的 ssh 设置任何 X 显示,所以 dpd -d 无法启动浏览器我的win box通过putty使用终端。因此,我不得不使用 doc(ugh) 安装 Windows,这很痛苦,以使仪表板网页通过终端加载。所以它使用我的windows盒子作为本地主机,理想情况下我会在我的linux盒子上利用我已经设置的灯堆栈apache服务器,我用它来开发我通过putty访问的......
  • 也在那个 mongodb 上,这很有趣,因为对于彼此的 npm 包,安装了一个具有相同名称的二进制文件,例如dpd 用于部署,但对于 mongo,我认为没有安装可以通过路径访问的二进制文件。它是一个数据库,我认为访问方式不同。所以我一开始在高处和低处搜索路径,整个系统上唯一在其文件名中包含“mongod”的东西就是那个。我希望能够简单地将二进制文件添加到我的路径中,就像所有其他 npm 安装一样..
  • 好吧,我现在看到了,/usr/bin/node_modules/bin/lib/node_modules/mongodb 所以我也可以使用那个...是的。更新了 OP,对此进行了编辑..

标签: node.js npm deployd


【解决方案1】:

通知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 可能已经为此逻辑链添加了一个很好的错误输出。

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

分辨率:


如果您从sudo 安装 dpd 或 npm,或以其他方式产生了一些权限问题,则此命令将修复权限,并使用对 mongodb 的引用开始部署(如有必要):

$ 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 部署运行,则必须以管理员身份运行 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 包)

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 应该可以正常运行,并且您的应用程序,无论是资产应用程序还是其他应用程序,现在都可以正确访问模块。

【讨论】:

  • 尽管您在原始问题中声明您的权限设置正确:)...我很高兴您能够解决您的问题。另请注意,NPM 和 Mongo 不需要安装 sudo。有关如何解决的更多信息,请参阅stackoverflow.com/questions/16151018/…
  • 哦,我明白了。我的错......在你的最后评论中,AWSOME......那可能是我的另一个(主要)问题。哇,我从错误的角度看它,我敢打赌它是 .npm 傻瓜。现在递归它..
  • 是的,一切都很好。我递归了.npm,我认为这解决了所有剩余的问题......
  • 我在那里对这个答案进行了一些改进,希望这会对那里的完整套餐交易有所帮助! :-)
猜你喜欢
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 2023-03-07
  • 2013-10-03
  • 2021-01-19
相关资源
最近更新 更多