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