我正在尝试使用 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 使用正确的端口?
出现此问题是因为 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',
},
},
],
};