javascript - 在 Heroku 上部署 Node.js 失败 : TypeError: Cannot read property 'split' of null

标签 javascript node.js mongodb heroku mongodb-atlas

有人知道这个错误是什么意思吗? 我的应用程序位于 Node.js 上,数据库位于 Atlas 上。当我尝试在 Heroku 上部署它时,我在日志中收到此错误消息:

TypeError: Cannot read property 'split' of null at parseSrvConnectionString (/app/node_modules/mongodb/lib/core/uri_parser.js:40:23) at parseConnectionString (/app/node_modules/mongodb/lib/core/uri_parser.js:556:12) at connect (/app/node_modules/mongodb/lib/operations/connect.js:272:3)
at /app/node_modules/mongodb/lib/mongo_client.js:218:5 at maybePromise (/app/node_modules/mongodb/lib/utils.js:719:3) at MongoClient.connect (/app/node_modules/mongodb/lib/mongo_client.js:214:10) at Function.MongoClient.connect (/app/node_modules/mongodb/lib/mongo_client.js:432:22) at Database.connect (/app/database.js:9:15) at Object. (/app/database.js:21:4) at Module._compile (internal/modules/cjs/loader.js:1118:30) [31m[nodemon] app crashed - waiting for file changes before starting...[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;

app.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`)

关于javascript - 在 Heroku 上部署 Node.js 失败 : TypeError: Cannot read property 'split' of null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61600109/

相关文章:

javascript - NOT 在 Node/ Mongoose 中不起作用

node.js - 使用时区的 CronJob

javascript - Mocha 一开始从 MongoDb 查找用户,稍后创建

node.js - AWS Lambda 数据库连接问题[更新的问题]

javascript - 尽管在 React 中设置了值,但单选按钮未选中

javascript - 如何使用 jQuery 处理类(由 jQuery 制作)?

node.js - npm install -g npm 没有更新

python - 使用 null 或不存在的属性解析 JSON

javascript - 将分隔字符串转换为 Javascript 中的对象数组

javascript - Google map 标记 DROP