Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无法找到什么';我的服务有什么问题吗_Node.js_Linux_Npm_Service - Fatal编程技术网

Node.js 无法找到什么';我的服务有什么问题吗

Node.js 无法找到什么';我的服务有什么问题吗,node.js,linux,npm,service,Node.js,Linux,Npm,Service,我有一个小的节点应用程序。 当我跑步的时候,它工作的很好 pi@rpb:/opt/linear-actuator $ /home/pi/.nvm/versions/node/v14.8.0/bin/npm start 我创建了一个服务,以确保它在启动时自动启动 [Unit] Description=LinearActuator After=network.target [Service] WorkingDirectory=/opt/linear-actuator ExecStart=/hom

我有一个小的节点应用程序。 当我跑步的时候,它工作的很好

pi@rpb:/opt/linear-actuator $ /home/pi/.nvm/versions/node/v14.8.0/bin/npm start
我创建了一个服务,以确保它在启动时自动启动

[Unit]
Description=LinearActuator
After=network.target

[Service]
WorkingDirectory=/opt/linear-actuator
ExecStart=/home/pi/.nvm/versions/node/v14.8.0/bin/npm start
Restart=always
User=pi
Environment=PORT=8081

[Install]
WantedBy=multi-user.target

但我的服务无法启动(我以前启用过)。 《华尔街日报》说

août 27 21:37:16 rpb npm[1913]: > linearactuator@1.0.0 start /opt/linear-actuator
août 27 21:37:16 rpb npm[1913]: > node server.js
août 27 21:37:18 rpb npm[1913]: /opt/linear-actuator/server.js:4
août 27 21:37:18 rpb npm[1913]: import express from 'express';
août 27 21:37:18 rpb npm[1913]: ^^^^^^
août 27 21:37:18 rpb npm[1913]: SyntaxError: Unexpected token import
我在使用旧版本的node运行应用程序时出现此错误。但在我的服务中使用的绝对路径很好

pi@rpb:/opt/linear-actuator $ which node
/home/pi/.nvm/versions/node/v14.8.0/bin/node
pi@rpb:/opt/linear-actuator $ node -v
v14.8.0
pi@rpb:/opt/linear-actuator $ which npm
/home/pi/.nvm/versions/node/v14.8.0/bin/npm
pi@rpb:/opt/linear-actuator $ npm -v
6.14.7

有没有关于我所缺少的东西的线索?:)

导入语法仅对模块有效。您应该将文件从
server.js
重命名为
server.mjs

从节点14开始,只支持
import
语法(无实验标记)。根据您打印的节点和npm版本,您确实使用nvm安装了node 14+。但是,当您的服务运行时,将获取旧版本的NodeJS。很可能是您使用捆绑包管理器(apt?)安装的东西

NVM不在标准linux二进制位置(/usr/bin或/usr/local/bin)中存储或链接节点二进制文件。但是,它会在.profile或.bashrc(基于终端)中添加一些脚本,以使用正确的节点二进制路径更新路径env var。通常:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
现在,当执行服务时,systemd必须按原样运行
execStart
命令;不加载.profile/.bashrc文件,无论从何处执行nvm脚本。如果您不打算经常更改节点的版本,您可以忘记nvm,只需将服务中的PATH env var设置为来自终端的当前$PATH。只需运行
echo$PATH
选择结果并粘贴在下面的占位符中

[Unit]
Description=LinearActuator
After=network.target

[Service]
WorkingDirectory=/opt/linear-actuator
ExecStart=/home/pi/.nvm/versions/node/v14.8.0/bin/npm start
Restart=always
User=pi
Environment=PORT=8081
Environment=PATH=<Put the result of `echo $PATH` here>

[Install]
WantedBy=multi-user.target

在此之后,将服务中的execStart指向这个新创建的shell脚本,而不是直接运行npm start。

BTW,您的问题没有提到这个“服务”的用途。如果它只是一台服务器,而您的目的是让服务器永远运行,那么只需使用
pm2
。这将需要更少的维护,并且将更适合服务器管理。
#!/bin/bash
[ -s "/home/pi/.nvm/nvm.sh" ] && \. "/home/pi/.nvm/nvm.sh"
cd /opt/linear-actuator
npm start