You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署在Heroku的Node.js应用从MongoDB返回空数组求助

Heroku部署应用从MongoDB获取电影数据返回空数组排查求助

我将应用部署在Heroku平台,本应从MongoDB数据库获取电影数据,但/movies接口始终返回空数组,尝试多种方法仍无法解决问题。

环境与结构说明

  • MongoAtlas集群中存在movies集合,且集合内存储有电影数据(附集群结构截图)

服务端核心代码

const express = require ('express'),
  fs = require('fs'),
  path = require('path'),
  bodyParser = require('body-parser'),
  uuid = require('uuid'),
  morgan = require('morgan'),
  mongoose = require('mongoose'),
  dotenv = require('dotenv').config(),
  Models = require('./models.js');

const { check, validationResult } = require('express-validator');

const Movies = Models.Movie;
const Users = Models.User;

const app = express();

app.use(bodyParser.json());

// 连接MongoDB,CONNECTION_URI已在.env和Heroku配置变量中定义
mongoose.connect(process.env.CONNECTION_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    })
    .catch((err) => console.error('MongoDb connection failed: ' + err));
mongoose.connection.on('error', (err) => {
    console.error('MongoDb connection error: ' + err);
});

const cors = require('cors');
app.use(cors());

// 导入认证模块
let auth = require('./auth')(app);
const passport = require('passport');
require('./passport');

// 日志记录配置
const accessLogStream = fs.createWriteStream(path.join(__dirname, 'log.txt'), {flags: 'a'})
app.use(morgan('combined', {stream: accessLogStream}));
app.use('/documentation.html', express.static('public/documentation.html'));

// 打印连接URI用于排查
console.log("Connection URI:", process.env.CONNECTION_URI);

// 获取电影列表接口
app.get('/movies', passport.authenticate('jwt', { session: false }), (req, res) => {
    Movies.find()
    .then((movies) => {
        console.log('Movies fetched:', movies);
        res.status(200).json(movies);
        })
    .catch((err) => {
        console.error(err);
        res.status(500).send('Error: ' + err);
    });
});

// 全局错误处理
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Something broke!');
  });

// 启动服务
const port = process.env.PORT || 8080;
app.listen(port, '0.0.0.0',() => {
 console.log('Listening on Port ' + port);
});

models.js代码

const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

let movieSchema = mongoose.Schema({
    Name: {type: String, required: true},
    Director: [{ Name: String, Description: String, required:false}],
    ImagePath: {type: String},
    Description: {type: String, required: true},
    Tags: [{ Name: String, Description: String}],
    Featured: {type: Boolean}
}, {collection: 'movies'})

let Movie = mongoose.model('Movie', movieSchema);

module.exports.Movie = Movie;

已尝试的操作

  • 移除movieSchema中的{collection: 'movies'}定义,问题依旧存在

测试结果

  • 使用Postman携带有效JWT令牌请求/movies接口,返回空数组
  • Heroku日志显示Movies fetched: []
  • 本地localhost:1234环境测试,请求可正常发起,但返回的电影数据仍为空数组

我判断问题出在后端逻辑或数据库连接映射环节,恳请各位提供技术排查思路或解决方案!

内容的提问来源于stack exchange,提问作者jaceyH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:17:54