【问题标题】:Server file works fine locally, but once deployed (on Heroku), MongoDB returns "false" instead of JSON服务器文件在本地工作正常,但一旦部署(在 Heroku 上),MongoDB 返回“false”而不是 JSON
【发布时间】:2020-05-07 02:59:06
【问题描述】:

在网站的已部署版本上尝试从 MongoDb 加载 JSON 数据时,它返回 false。在本地执行时没有问题。在 CLI 中检查 heroku logs 告诉我,在问题函数(位于 issues.js 中)中,它“无法读取未定义的 toArray() 属性”。

主要有三个文件:server.js

'use strict';

const express = require('express'),
      app = express(),
      issues = require('./routes/issues'),
      users = require('./routes/users'),
      bodyParser = require('body-parser');


app.use(bodyParser.json());

// routing for issue management
app.get('/issues', issues.getAllIssues);
app.put('/issues/issues.json', issues.putNewIssue);
app.post('/issues/:issue_id.json', issues.postIssueUpdate);
app.delete('/issues/:issue_id.json', issues.deleteIssue);

// routing for user management
app.get('/users', users.getAllUsers);
app.put('/users/users.json', users.putNewUser);

app.get('/', (req, res) => {
    res.header('Content-Type', 'text/html');
    res.end('<h1>Issue Manager</h2>');
})

let port = process.env.PORT;
if (port == null || port =='') {
    port = 3000;
}

app.listen(port);

... routing.js 中产生“假”结果的函数

const im = require('issue_manager');

exports.getAllIssues = async (req, res) => {
    let allIssues = await im.issues();
    console.log(allIssues);
    console.log('Operation complete.');
    res.json(allIssues);
}

...模块,issues.js,包含 MongoDb 客户端并处理请求

'use strict';

const MongoClient = require('mongodb').MongoClient;

let db, allIssues; 

(async function() {
    const uri = 'censored';
    const dbName = 'IssueManager';
    let client;

    client = MongoClient.connect(uri, 
        { useNewUrlParser: true, 
          useUnifiedTopology: true })
                .then(data => {
                    return data;
                })
                .catch(err => {
                    return err;
                });

    try {
        db = (await client).db(dbName);
        allIssues = (await db).collection('Issues').find();
    } catch (e) {
        console.log(e);
    }
})();

exports.issues = async () => {
    try {
        return await allIssues
            .toArray()
            .then((data) => {
                return data;
            })
            .catch((err) => {
                return err;
            });
    } catch (e) {
        console.error(e);
        return false;
    }
}

【问题讨论】:

    标签: javascript node.js json mongodb heroku


    【解决方案1】:

    如果您的代码在本地环境中运行良好,那么我认为您应该:

    1. 确认您部署的应用程序可以连接到您的 MongoDB 服务器。
    2. 如果不能,请确认您在部署的应用程序中使用了正确的环境变量/凭据。

    这是我们在部署时都会遇到的常见错误。 =)

    【讨论】:

    • 我仔细检查了数据库 URI 的 env 变量是否准确。似乎任何时候我将 URI 分配给 process.env.DB_URI 时,它甚至在本地都没有检测到数据库。至于检查部署的应用程序是否可以连接,我不知道除了加载它并执行 GET 请求之外的其他方法。
    猜你喜欢
    • 2021-01-27
    • 2021-04-28
    • 2013-05-21
    • 2012-08-16
    • 2011-11-11
    • 2021-06-25
    • 2014-09-09
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多