PM2 强制 Node.js 使用端口 5000,尽管显式配置了端口 5001

问题描述 投票:0回答:1

我正在尝试使用 PM2 运行带有 Express 和 MongoDB 的 Node.js 应用程序。该应用程序配置为在端口 5001 上运行,但即使将端口显式设置为 5001,PM2 仍将应用程序绑定到端口 5000。这是我到目前为止所做的操作:

    const express = require('express');
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const dotenv = require('dotenv');

// Initialize app
const app = express();

// Middleware to parse JSON
app.use(express.json());

// Environment variables
dotenv.config();

// MongoDB Connection
mongoose.connect(process.env.MONGO_URI || 'mongodb://localhost:27017/devtrust', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
})
.then(() => console.log('Connected to MongoDB'))
.catch((err) => console.error('MongoDB connection error:', err));

// User model
const User = mongoose.model('User', new mongoose.Schema({
  email: { type: String, required: true, unique: true },
  password: { type: String, required: true }
}));

// Signup route (create user)
app.post('/api/signup', async (req, res) => {
  try {
    const { email, password } = req.body;
    // Input validation
    if (!email || !password) {
      return res.status(400).json({ error: 'Email and password are required' });
    }

    // Check if user already exists
    const existingUser = await User.findOne({ email });
    if (existingUser) return res.status(400).json({ error: 'User already exists' });

    // Hash the password
    const hashedPassword = await bcrypt.hash(password, 10);

    // Save the user
    const user = new User({ email, password: hashedPassword });
    await user.save();
    res.status(201).json({ message: 'User created successfully' });
  } catch (err) {
    console.error(err);
    res.status(500).json({ message: 'Error creating user', error: err.message });
  }
});

// Login route (authenticate user)
app.post('/api/login', async (req, res) => {
  try {
    const { email, password } = req.body;

    // Input validation
    if (!email || !password) {
      return res.status(400).json({ error: 'Email and password are required' });
    }

    const user = await User.findOne({ email });
    if (!user) return res.status(400).json({ error: 'Invalid credentials' });

    // Compare passwords
    const isPasswordValid = await bcrypt.compare(password, user.password);
    if (!isPasswordValid) return res.status(400).json({ error: 'Invalid credentials' });

    // Generate JWT token
    const token = jwt.sign({ userId: user._id }, process.env.JWT_SECRET, { expiresIn: '1h' });
    res.json({ token });
  } catch (err) {
    console.error(err);
    res.status(500).json({ message: 'Error logging in', error: err.message });
  }
});

// Test route to verify the server is running
app.get('/test', (req, res) => {
  res.json({ message: 'Server is working' });
});

// Start server
const PORT = process.env.PORT || 5001;
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

采取的步骤: 我在 .env 文件和 server.js 文件中将 PORT 环境变量显式设置为 5001。 我通过以下命令使用 PM2 启动服务器: 巴什 复制代码 PORT=5001 pm2 启动 server.js --name devtrust-backend -f 我确认服务器仍在侦听端口 5000 而不是 5001,即使应用程序配置为使用端口 5001。 我尝试过的: 使用 pm2 stop all 和 pm2 delete all 停止并删除 PM2 进程,然后使用 PORT=5001 pm2 start server.js 重新启动它。 检查另一个进程是否正在使用端口 5000 并终止它(lsof -i :5000 和 Kill -9 )。 使用 pm2 记录 devtrust-backend 检查日志,但它仍然显示服务器在端口 5000 而不是 5001 上运行。 将 server.js 文件中的端口打印到控制台,以验证正在使用哪个端口。 我的问题: 为什么即使我设置了 PORT=5001,PM2 仍然将服务器绑定到端口 5000?如何强制 PM2 使用正确的端口?

node.js mongodb
1个回答
0
投票

出现此问题是因为 PM2 在使用 PORT=5001 pm2 start server.js 等内联声明时未正确传递 PORT 环境变量 确保您的 .env 文件正确配置为:

PORT=5001
然后停止并删除所有现有 PM2 进程以避免冲突:
pm2 stop all
pm2 delete all
创建一个 Ecosystem.config.js 文件来显式管理环境变量。 示例:

module.exports = {
  apps: [
    {
      name: 'devtrust-backend',
      script: './server.js',
      env: {
        PORT: 5001,
        NODE_ENV: 'development',
      },
      env_production: {
        PORT: 5001,
        NODE_ENV: 'production',
      },
    },
  ],
};

© www.soinside.com 2019 - 2024. All rights reserved.