【问题标题】:TypeError: Cannot read property 'then' of undefined node jsTypeError:无法读取未定义节点js的属性'then'
【发布时间】:2018-11-30 17:04:30
【问题描述】:

TypeError:无法读取未定义的属性“then” 你能帮我解决这个问题吗?谢谢。

var express = require('express');
var path = require('path');
var bodyParser = require('body-parser');
var mongodb = require('mongodb'); 

var dbConn = mongodb.MongoClient.connect('mongodb://localhost:27017', 
function(err, db) {
    if(err){
        throw err;
    }else{
        console.log("connected");
    }
})

var app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.resolve(__dirname, './')));

app.post('/post-feedback', function (req, res) {
    dbConn.then(function(db) {
        delete req.body._id; // for safety reasons
        db.collection('feedbacks').insertOne(req.body);
    });    
        res.send('Data received:\n' + JSON.stringify(req.body));
    });

app.get('/view-feedbacks',  function(req, res) {
        dbConn.then(function(db) {
        db.collection('feedbacks').find({}).toArray().then(function(feedbacks) {
            res.status(200).json(feedbacks);
        });
    });
});

app.listen(process.env.PORT || 3000, process.env.IP || '0.0.0.0' );

TypeError:无法读取未定义的属性“then” 你能帮我解决这个问题吗?谢谢。

【问题讨论】:

标签: node.js express routes


【解决方案1】:

以下方法应该可以帮助您入门,但不应将其用于生产
(参考:How do I manage MongoDB connections in a Node.js web application?)。通读其他生产初学者。

var express = require('express');
var path = require('path');
var bodyParser = require('body-parser');
var mongodb = require('mongodb'); 

var dbConn = function() {
    return new Promise((resolve, reject) => {
        mongodb.MongoClient.connect('mongodb://localhost:27017', 
            function(err, db) {
                if(err){
                    return reject(err);
                }else{
                    return resolve(db);
                } 
        });
    });
}

var app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.resolve(__dirname, './')));

app.post('/post-feedback', function (req, res) {
    dbConn()
    .then(function(db) {
        delete req.body._id; // for safety reasons
        db.collection('feedbacks').insertOne(req.body);
        res.send('Data received:\n' + JSON.stringify(req.body));
    })
    .catch(err => {
        console.log(err)
        res.send('Error');
    })
});

app.get('/view-feedbacks',  function(req, res) {
        dbConn()
        .then(function(db) {
            db.collection('feedbacks').find({}).toArray().then(function(feedbacks) {
                res.status(200).json(feedbacks);
            });
        })
        .catch(err => {
            console.log(err);
            res.status(500).json({});
        });
});

app.listen(process.env.PORT || 3000, process.env.IP || '0.0.0.0' );


生产启动器:

理想情况下,您将有类似以下的内容 say in a file db.js

let mongoClient = require('mongodb').MongoClient,
   logger = require('winston');

function DATABASE() {
   this.dbObj = null;
   this.myCollection = null; // You will need to add more collections here
}

DATABASE.prototype.init = function (config, options) {
   let self = this;
   self.config = config; //can pass a config for different things like port, ip etc.
   self.logger = logger;

   return new Promise(function (resolve, reject) {
      if (self.initialized) {
         return resolve(self);
      }
      let connectionUri = "mongodb://localhost:27017";     //self.config.mongo.connectionUri;
      mongoClient.connect(connectionUri, {native_parser: true}, function     (err, db) {
         if (err) {
            reject(err);
         }
         else {
            self.dbObj = db;
            self.myCollection = db.collection('myCollection');
            self.initialized = true;
            self.logger.info("db init success");
            return resolve(self);
         }
      });
   });
};

var dbObj = null;

var getdbObj = function () {
   if (!dbObj) {
      dbObj = new DATABASE();
   }
   return dbObj;
}();

module.exports = getdbObj;


在您的主应用程序启动文件中,您将拥有如下内容:

let dbObj = require('./db.js');
dbObj.init()
.then(db => {
     console.log('db initialized successfully');
     //db.dbObj.collection('myCollection').find()
     //or
     //db.myCollection.find() because this has been already initialized in db.js
     var app = express();
     app.use(bodyParser.urlencoded({ extended: false }));
     app.use(express.static(path.resolve(__dirname, './')));

     app.post('/post-feedback', function (req, res) {
         delete req.body._id; // for safety reasons
         db.dbObj.collection('feedbacks').insertOne(req.body);
         res.send('Data received:\n' + JSON.stringify(req.body));
     });

     app.get('/view-feedbacks',  function(req, res) { 
         //db.collection('feedbacks')
     });

     app.listen(process.env.PORT || 3000, process.env.IP || '0.0.0.0' )
})
.catch(err => console.log(err));

【讨论】:

    【解决方案2】:

    试试这个,dbConn 不答应

    app.post('/post-feedback', function (req, res) {
        mongoose.connection.db.collection('feedbacks', function (err, collection) {
            collection.insertOne(req.body);
            res.send('Data received:\n' + JSON.stringify(req.body));
        });
    
        // OR
    
        const Model = mongoose.model('feedbacks');
        let model = new Model();
        model = Object.assign(model, req.body);
        model.save().then((result) => {
            res.send('Data received:\n' + JSON.stringify(req.body));
        });
    });
    

    【讨论】:

      【解决方案3】:

      它的工作。
      如果你收到任何类型错误(UnhandledPromiseRejectionWarning: TypeError: db.collection is not a function)形式的 mongodb。只需将 mongodb 的版本更改为 -

      “mongodb”:“^2.2.33”

      "use strict"
      var express = require('express');
      var mongodb = require('mongodb');
      var app = express();
      var MongoClient = mongodb.MongoClient;
      var url = 'mongodb://localhost:27017/feedback';
      // no need to call then() yet
      var dbConn = MongoClient.connect(url);
      
      app.set('port', 5000);
      
      app.listen(app.get('port'), function() {
          console.log('feedback is running on port', app.get('port'));
      });
      
      
      app.get('/view-feedback', function(req, res, next) {
          // the connection is opened
      
          dbConn.then(function(db) {
              // var dbo = db.db("feedback");
              db.collection('feedback').find({}).toArray().then(function(docs) {
                  // return docs;
                  res.json(docs)
              });
          });
      });
      

      【讨论】:

        猜你喜欢
        • 2017-07-19
        • 2017-03-12
        • 2018-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-19
        • 2014-09-07
        相关资源
        最近更新 更多