为什么在Ubuntu 16.04上安装Node 6.x实际上安装的是Node 4.2.6?

这是我在Ubuntu 16.04上安装Node的步骤:
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs 
sudo apt-get install -y npm

这是官方指示:

https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions

完成这个步骤后,运行nodejs --version会返回v4.2.6

由于我使用了setup_6.x,我本以为安装的版本应该以6开头。

我想也许setup_6.x应该是setup_6.2.1,但是那个页面返回了404错误,请参见:

https://deb.nodesource.com/setup_6.x(页面存在)

https://deb.nodesource.com/setup_6.2.1(返回404错误)

如何在Ubuntu 16.04上安装最新稳定版的Node.js?

编辑:

以下是运行sudo apt-get install -y nodejs后的结果:

sudo apt-get install -y nodejs 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  gyp libboost-python1.58.0 libjs-inherits libjs-node-uuid libjs-underscore
  libssl-dev libssl-doc libuv1-dev linux-headers-4.4.0-18
  linux-headers-4.4.0-18-generic linux-headers-4.4.0-21
  linux-headers-4.4.0-21-generic linux-image-4.4.0-18-generic
  linux-image-4.4.0-21-generic linux-image-extra-4.4.0-18-generic
  linux-image-extra-4.4.0-21-generic linux-signed-image-4.4.0-18-generic
  linux-signed-image-4.4.0-21-generic python-configobj python-pycurl
  python-pyexiv2 python-pyexiv2-doc
Use 'sudo apt autoremove' to remove them.
The following NEW packages will be installed:
  nodejs
0 to upgrade, 1 to newly install, 0 to remove and 0 not to upgrade.
Need to get 0 B/3,162 kB of archives.
After this operation, 13.2 MB of additional disk space will be used.
Selecting previously unselected package nodejs.
(Reading database ... 329473 files and directories currently installed.)
Preparing to unpack .../nodejs_4.2.6~dfsg-1ubuntu4_amd64.deb ...
Unpacking nodejs (4.2.6~dfsg-1ubuntu4) ...
Processing triggers for doc-base (0.10.7) ...
Processing 1 added doc-base file...
Registering documents with scrollkeeper...
Processing triggers for man-db (2.7.5-1) ...
Setting up nodejs (4.2.6~dfsg-1ubuntu4) ...
update-alternatives: using /usr/bin/nodejs to provide /usr/bin/js (js) in auto mode

编辑:

apt-cache policy nodejs的结果如下:

apt-cache policy nodejs
nodejs:
  Installed: 4.2.6~dfsg-1ubuntu4
  Candidate: 4.2.6~dfsg-1ubuntu4
  Version table:
 *** 4.2.6~dfsg-1ubuntu4 500
        500 http://au.archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
        100 /var/lib/dpkg/status

请将apt-cache policy nodejs的输出副本包含在您的问题中作为编辑。 - Thomas Ward
系统拉入NodeJS 4.x的事实意味着要么您运行了错误的脚本,要么存储库未正确添加到系统中 - 使用您提供链接页面中概述的确切步骤,我能够按原样获取最新版本,所以可能存在许多问题 - 如果您可以提供apt-cache数据,以便我们可以查看您的计算机在存储库中存在什么,我们可能能够提供进一步的帮助。 - Thomas Ward
@ThomasW. - 在帖子中添加了数据。 - user1063287
1感谢提供更新的数据。看起来脚本由于某种原因没有按照预期执行。我在下面的回答中详细说明了这种情况以及手动执行脚本所需的步骤。您可以使用这些步骤从NodeJS获取最新版本。虽然不像脚本那样简单方便,但它实际上是脚本的核心功能。 - Thomas Ward
我想指出,直接从互联网上将脚本传输到sudo权限的shell中并不是一个好主意... - pipe
1@pipe 幸好有像我这样在可摧毁的虚拟机中运行脚本的人,这样我们就能看到它在做什么。这就是我在回答中得出指示的方式,所以我们可以手动执行那个“脚本”做的事情呵呵。 - Thomas Ward
显然自从提出问题以来,脚本已经修复。我刚刚在我的Ubuntu 16.04系统上运行了它,成功安装了node v6.9.1npm 3.10.8。此时的说明只需要执行sudo apt-get install nodejs(在通过管道传输脚本后),你问题中的sudo apt-get install -y npm这一行已经不再出现在官方说明中。 - Marcus Junius Brutus
8个回答

核心原因是安装脚本没有正确运行。因此,感谢OP提供的更新数据,支持了这一点,由于脚本没有正确配置,所以apt从未看到来自NodeSource仓库的数据。
因此,脚本可能没有找到您的发行版,或者在配置仓库时出现问题,或者可能存在网络中断,或者其他一千种导致其中断并未完成工作的原因。
您看到版本4.x被安装的事实意味着脚本没有正确执行其任务,所以不能完全归咎于脚本。这只是意味着我们可能需要采用更困难的方式来解决问题。
引用: 我应该指出:脚本实际上并不执行任何安装操作 - 它只是确定您所使用的Debian/Ubuntu版本,并为其配置仓库以获取数据。安装部分实际上是您手动运行的sudo apt-get install步骤。
另外需要注意的是:这将删除 `npm` 包,但这是因为使用此上游打包的 `nodejs` 将包含 `npm` - 不再需要 `npm` 包。
不必依赖脚本,我们可以以老派的方式手动完成脚本所做的工作:自己动手设置存储库配置并安装NodeJS。
以下是手动完成此任务的步骤,基本上与脚本相同(除了第四步,用于确保获取准确的版本数据):
  1. 创建一个新文件:/etc/apt/sources.list.d/nodesource.list

    你需要使用sudo来创建这个文件,但是在创建文件时,请将以下内容放入其中:

    deb https://deb.nodesource.com/node_6.x xenial main
    deb-src https://deb.nodesource.com/node_6.x xenial main
    

    然后保存文件。(将node_6.x替换为node_7.xnode_8.x等较新的Node版本)

  2. 从Nodesource下载存储库的GPG签名密钥。否则,在使用apt-get update时可能会出现NO_PUBKEY错误(如果没有安装curl,请在此命令中使用wget,如果两者都没有安装,请安装其中之一):

    curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add -
    
  3. 手动运行sudo apt-get update

    这将刷新来自nodesource存储库的数据,以便apt知道存在更新版本。

    如果出现NO_PUBKEY GPG错误,则返回第2步

  4. 检查apt-cache policy nodejs的输出。

    这不是由脚本完成的,但你要确保在输出中看到类似以下内容的条目(尽管版本可能不同,如果您没有使用6.x作为版本字符串,则唯一关心的是通过nodesource提供了一个更新的版本号):

    Version table:
        6.2.1-1nodesource1~xenial1 500
           500 https://deb.nodesource.com/node_6.x xenial/main amd64 Packages
        4.2.6~dfsg-1ubuntu4 500
           500 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
    

    如果你没有看到这样的条目,只看到4.2.6,请重新开始。否则,请继续。

  5. 安装nodejs二进制文件。现在你已经确认6.x在你的系统上可用,你可以安装它:sudo apt-get install nodejs

  6. nodejs --version现在应该显示类似于v6.2.1的输出(只要以v6.开头,你就是在使用6版本;如果你使用的是比6更高的版本号,那么它可能是一个更高的版本号,但只要不是4.2.6,你就可以继续)。


4完全按照这个方法操作,所有的要点都与所描述的行为相符。非常感谢你。 - user1063287
1@user1063287 不客气!希望这能帮到其他人,如果脚本对他们也不起作用的话!享受使用最新的NodeJS吧! - Thomas Ward
哦,原来这就是为什么我以为自己有Node 6版本,但实际上并没有,而且程序一直在抱怨我需要6版本。谢谢! - cat
谢谢,运行得很好。我注意到在我的/etc/apt/sources.list.d/nodesource.list文件中有一条关于禁用的注释,而且还包含了旧版本0.x的内容,而我已经升级到了4.x的node -v版本。指示非常清晰明了。 - DaveStSomeWhere
1鉴于默认情况下未安装curl,另一种选择是使用wget wget -O - https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add - - gerardw
我明显不理解它是如何工作的,但事实上解决方案是正确的。谢谢 - Vahe Gharibyan
唉..我不再是一个程序员了,我成了一个依赖管理器和谷歌搜索者.. :) 这个方法有效,除了第二步 - 终端会一直卡住,我通过搜索找到了类似的问题,但没有解决方案。然而,继续进行剩下的步骤确实有效,并且产生了一个令人欣喜的结果 which nodejs = v8.10.0 - Oliver Williams
@ThomasWard,如果你知道或使用的支持教程或资源的链接,将使这篇帖子更加出色。 - Oliver Williams
@OliverWilliams 这有点困难,因为Node只提供了一个用于这些东西的shell脚本。上述内容是对6.x安装程序提供的脚本进行逐行剖析的结果。步骤2卡住表示有某些东西阻塞了流量,超出了本问题/回答的范围。(我个人不使用Node,但我能轻松地解析这些内容) - Thomas Ward
运作得很顺利!谢谢! - georgebrindeiro
非常感谢,这篇文章让我这一周过得很愉快。 - Tiago_nes
1在跟随这个过程时,我有点害怕,因为执行apt-get install nodejs命令会移除npm软件包。但后来我意识到新版本的nodejs软件包已经包含了npm,所以移除它是可以接受的。 - Supernormal

我之前使用的是旧版的Node。我只需要将旧版卸载即可:
sudo apt-get purge nodejs npm

然后,根据各个版本的需求(请参阅官方安装说明),将v=6中的6替换为7、8、9等。
v=6
curl -sL https://deb.nodesource.com/setup_$v.x | sudo -E bash -

(请确保您已安装了curl。)
最后,
sudo apt-get install -y nodejs

最新版本的Node,嘭!

4或者,对于Node v7,请使用 https://deb.nodesource.com/setup_7.x。请参考官方指南 - ryenus
2我的还是安装的v4.2.6版本。 - Freek Nortier
1@FreekNortier,我在Linux Mint 18上也遇到了这个问题。在执行sudo apt-get install python-software-properties命令并清除之前安装的版本后,我成功安装了第11版。我在tecadmincodebind上找到了这个建议。 - Ben

对于Ubuntu 16.04.2版本的用户(稍微修改了Thomas的帖子并感谢他):
1. 打开软件更新器。

2.setting

3.其他软件
4.添加来源,但记得稍后选择所有新的来源选项 示例:
deb https://deb.nodesource.com/node_6.x xenial main
deb-src https://deb.nodesource.com/node_6.x xenial main

5.reload

6. sudo apt-get update 7. apt-cache policy nodejs //获取新版本表并检查源是否设置完成
8. sudo apt install nodejs
9. nodejs --version
现在一切都准备好了......
警告:不要从更新面板更改您的NVIDIA显卡的Linux默认驱动程序....系统会崩溃....!!!

1它安装的是v4.2.6版本。 - Prashant Prabhakar Singh
很好!对我有效。 - ejaenv

我遇到了同样的问题。但在我的情况下,我不得不升级我的curl命令。 你可以通过使用-S选项来查看这个问题。
curl -s -S https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add -

显示了问题
curl: (1) Protocol "https" not supported or disabled in libcurl
gpg: no valid OpenPGP data found.

所以我通过运行以下命令解决了这个问题。
sudo apt-get install curl
sudo apt autoremove
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install nodejs

解决了问题 - SadeepDarshana

通过添加@Thomas Ward的答案,解决了安装Node.js 8.x时遇到的https URL或代码始终安装v4.2.6并显示证书错误的问题,请尝试添加以下行到nodesource.list文件中。
deb http://deb.nodesource.com/node_8.x xenial main
deb-src http://deb.nodesource.com/node_8.x xenial main

下一步:运行
sudo curl -sL http://deb.nodesource.com/setup_8.x | sudo -E bash -

那么

sudo apt-get install -y nodejs

这将通过安装更新的nodejs版本和npm版本来解决您的问题,就像它为我解决了Ubuntu 16.04 LTS的问题一样。

嘿,伙计们,如果你们使用的是Ubuntu 16,请尝试以下步骤。这对我来说完美地起作用了。在此过程中,当被要求时,请提供您的帐户密码。
  1. sudo su -c "echo 'deb https://deb.nodesource.com/node_8.x xenial main' >> /etc/apt/sources.list.d/nodesource.list"

  2. sudo su -c "echo 'deb-src https://deb.nodesource.com/node_8.x xenial main' >> /etc/apt/sources.list.d/nodesource.list"

  3. sudo apt-get update

  4. apt-cache policy nodejs 检查列出的版本是否包含node 8

  5. sudo apt-get install nodejs

  6. nodejs -v 检查已安装的node版本

这将成功在您的系统上安装nodejs版本8。如果您希望安装其他版本,请在第1和第2步更改版本号,它将成功工作。


我找到了这个链接,它帮助我安装了Nodejs8____https://www.ubuntuupdates.org/ppa/nodejs_7.x。我不得不在那一行加入Nojs8https,因为它说我需要达到二级才能发布超过两个链接。我觉得这有点随机,但无所谓。
在安装之前,我运行了以下命令:apt-get remove --purge version nodejs
要验证您是否没有安装任何版本,请运行:apt-cache policy nodejs和/或nodejs --version
我只需将7改为8就成功安装了Node js 8,并且我得到的是8.1.3版本。为此,我运行了上面提到的页面中的命令,但这里还是列出一下这些命令:
使用以下命令下载存储库密钥:
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -

然后设置仓库:
sudo sh -c "echo deb https://deb.nodesource.com/node_7.x zesty main \ > /etc/apt/sources.list.d/nodesource.list"

sudo apt-get update

sudo apt-get install nodejs

如果你想要 Node.js 8,只需将命令行中的数字7改为8,就大功告成了!

我尝试按照https://github.com/nodesource/distributions上的版本8的说明进行操作,但对我来说没有起作用。我直接在浏览器中访问了https://deb.nodesource.com/setup_8.x,然后将脚本复制粘贴到我的系统上的一个文件nodejs.sh中。然后我执行了以下命令。
sudo -E bash nodejs.sh
apt-cache policy nodejs
sudo apt-get install nodejs

命令apt-cache显示了两个版本,优先安装8版本。安装文件后可以删除。不确定为什么将文件复制到本地有帮助,因为curl命令正确显示了脚本。