![](/img/trans.png)
[英]MongoDB Node.js TypeError: Cannot read property 'db' of null
[英]Node.js deploy on Heroku fail : TypeError: Cannot read property 'split' of null
有誰知道錯誤是什么意思? 我在 Node.js 上有我的應用程序,在 Atlas 上有我的數據庫。 當我嘗試在 Heroku 上部署它時,我在日志中收到以下錯誤消息:
TypeError:無法在 parseSrvConnectionString (/app/node_modules/mongodb/lib/core/uri_parser.js:40:23)處讀取 null 的屬性“拆分”(/app/node_modules/mongodb/lib/core/uri_parser.js: 556:12) 在連接 (/app/node_modules/mongodb/lib/operations/connect.js:272:3)
在 /app/node_modules/mongodb/lib/mongo_client.js:218:5 在 MaybePromise (/app/node_modules/mongodb/lib/utils.js:719:3) 在 MongoClient.connect (/app/node_modules/mongodb/lib /mongo_client.js:214:10) 在 Function.MongoClient.connect (/app/node_modules/mongodb/lib/mongo_client.js:432:22) 在 Database.connect (/app/database.js:9:15) 在Object。 (/app/database.js:21:4) 在 Module._compile (internal/modules/cjs/loader.js:1118:30) [31m[nodemon] 應用程序崩潰 - 在開始之前等待文件更改...[39m
數據庫.js
const mongo = require('mongodb').MongoClient; require('dotenv').config()
class Database {
constructor() {
this.client = null;
}
connect() {
mongo.connect(process.env.URL_DATABASE, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
if (err) throw err
this.client = client;
});
} }
const db = new Database(); db.connect(); console.log(db); module.exports = db;
路由器.js
const express = require('express'),
router = express.Router();
const db = require('./database');
const ObjectId = require('mongodb').ObjectID;
// GET ALL
router.get('/books', (req, res, next) => {
const localdb = db.client.db(process.env.DB_NAME);
const collection = localdb.collection(process.env.COLL_BOOKS);
collection.find({}).toArray(function (err, docs) {
if (err) throw err
res.status(200).send(docs);
});
});
// GET ONE
router.get('/books/:name', (req, res, next) => {
let name = req.params.name
const localdb = db.client.db(process.env.DB_NAME);
const collection = localdb.collection(process.env.COLL_BOOKS);
collection.findOne({ "name": name }, function (err, docs) {
if (err) throw err
res.status(200).send(docs);
});
});
// POST ONE
router.post('/books', (req, res, next) => {
const localdb = db.client.db(process.env.DB_NAME);
const collection = localdb.collection(process.env.COLL_BOOKS);
let newBook = req.body;
collection.insertOne(newBook, function (err) {
if (err) throw err
res.status(201).send(true);
});
});
// DELETE ONE
router.delete('/books/:name', (req, res, next) => {
const localdb = db.client.db(process.env.DB_NAME);
const collection = localdb.collection(process.env.COLL_BOOKS);
collection.deleteOne({ "name": req.params.name }, function (err) {
if (err) throw err
res.status(200).send(true)
})
});
// PUT ONE
router.put('/books/:name', (req, res, next) => {
const localdb = db.client.db(process.env.DB_NAME);
const collection = localdb.collection(process.env.COLL_BOOKS);
collection.updateOne({ "name": req.params.name }, { $set: req.body }, function (err) {
if (err) throw err
res.status(201).send(true);
});
});
module.exports = router;
應用程序.js
const express = require('express'),
app = express();
os = require('os');
const bodyParser = require('body-parser');
const cors = require('cors');
const router = require('./router.js')
require('dotenv').config()
app.use(cors());
app.use(bodyParser.json());
app.use('/api/v1', router);
const port = (process.env.PORT || '3001');
let server = app.listen(port, os.hostname(), () => {
let host = server.address().address,
port = server.address().port;
console.log("Example app listening at http://%s:%s", host, port);
});
我遇到了同樣的問題並通過不在 .env 文件中存儲mongo Uri的完整字符串來解決它。 相反,我只存儲了用戶和密碼
./config.env
DB_USER=youruser
DB_PASS=yourpassword
./app.js
mongoose.connect(`mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}@cluster0.pm4ek.gcp.mongodb.net/CommentsDB?retryWrites=true&w=majority`)
當我從 Heroku var config 中的 DB_URL 中刪除引號時出現錯誤,但現在它給我帶來了另一個錯誤,即:
TypeError: Cannot read property 'db' of null 2020-05-05T10:21:40.450337+00:00 app[web.1]: at /app/router.js:12:31 2020-05-05T10:21:40.450355+00:00 app[web.1]: at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) 2020-05-05T10:21:40.450356+00:00 app[web.1]: at next (/app/node_modules/express/lib/router/route.js:137:13) 2020-05-05T10:21:40.450356+00:00 app[web.1]: at Route.dispatch (/app/node_modules/express/lib/router/route.js:112:3) 2020-05-05T10:21:40.450357+00:00 app[web.1]: at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) 2020-05-05T10:21:40.450358+00:00 app[web.1]: at /app/node_modules/express/lib/router/index.js:281:22 2020-05-05T10:21:40.450358+00:00 app[web.1]: at Function.process_params (/app/node_modules/express/lib/router/index.js:335:12) 2020-05-05T10:21:40.450359+00:00 app[web.1]: at next (/app/node_modules/express/lib/router/index.js:275:10) 2020-05-05T10:21:40.450359+00:00 app[web.1]: at Function.handle (/app/node_modules/express/lib/router/index.js:174:3) 2020-05-05T10:21:40.450359+00:00 app[web.1]: at router (/app/node_modules/express/lib/router/index.js:47:12) 2020-05-05T10:21:57.090036+00:00 app[web.1]: /app/node_modules/mongodb/lib/utils.js:725 2020-05-05T10:21:57.090047+00:00 app[web.1]: throw error; 2020-05-05T10:21:57.090048+00:00 app[web.1]: ^ 2020-05-05T10:21:57.090048+00:00 app[web.1]:
我從 docker-compose yml 文件中刪除了引號,它現在對我有用。
我遇到了同樣的問題, 這個鏈接幫助我解決了這個錯誤。
TLDR; 您應該刪除 mongo URI config var 上的雙引號
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.