TypeError:无法读取未定义节点js的属性“ then”

时间:2018-06-21 11:19:18

标签: node.js express routes

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” 你能帮我解决这个问题吗?谢谢。

3 个答案:

答案 0 :(得分: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' );


生产入门:

理想情况下,您将在 a 文件 db.js say >

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));

答案 1 :(得分:0)

尝试一下,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));
    });
});

答案 2 :(得分:0)

正在工作。
如果您从mongodb中收到任何TypeError( UnhandledPromiseRejectionWarning:TypeError:db.collection不是函数)。只需将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)
        });
    });
});