服务器文件在本地运行良好,但是一旦部署(在Heroku上,MongoDB返回“ false”而不是JSON
[在网站的已部署版本上尝试从MongoDb加载JSON数据时,它返回false
。在本地进行操作没有任何问题。在CLI中检查heroku logs
会告诉我,在问题函数(位于issue.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;
}
}
回答如下:如果您的代码在本地环境中运行良好,那么我认为您应该:
- 确认您已部署的应用程序可以连接到您的MongoDB服务器。
- 如果不能,请确认您在已部署的应用程序中使用了正确的环境变量/凭据。
这是我们所有人在部署时都会遇到的常见错误。 =)
服务器文件在本地运行良好,但是一旦部署(在Heroku上,MongoDB返回“ false”而不是JSON
[在网站的已部署版本上尝试从MongoDb加载JSON数据时,它返回false
。在本地进行操作没有任何问题。在CLI中检查heroku logs
会告诉我,在问题函数(位于issue.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;
}
}
回答如下:如果您的代码在本地环境中运行良好,那么我认为您应该:
- 确认您已部署的应用程序可以连接到您的MongoDB服务器。
- 如果不能,请确认您在已部署的应用程序中使用了正确的环境变量/凭据。
这是我们所有人在部署时都会遇到的常见错误。 =)