如何使用Node.js显示存储在MongoDB中的数据?

时间:2018-07-30 13:49:09

标签: node.js mongodb

这是我用来显示MongoDB数据的代码。由于“ 未定义结果”而出现错误。我使用了MongoDB的ID来显示结果。但是存储的数据不会显示在单独的页面上。

const express = require('express');
const app = express();
const ejs = require('ejs');
const assert = require('assert');
const bodyParser = require('body-parser');
const MongoClient = require('mongodb').MongoClient;
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.set('view engine','ejs');
app.set('')
var url = 'mongodb://localhost:27017';

app.get('/form',(req, res)=>{

res.render('form');

});

app.get('/data',(req, res)=>{

    MongoClient.connect(url, (err, db)=>{
        assert.equal(null, err);
        var dbo = db.db("form");
    var details = dbo.collection('usertable').find();
    details.forEach((data)=>{
        if(_id == 5b5ef0b8e0d9c23c2012cef2){

            result = item;
            return true;
        }
    })
    });
    res.render('customerdata',{item: result });
    });

我能够使用以下代码存储数据:

app.post('/form/submit', (req, res)=>{

    var item = {
        title: req.body.title,
        content: req.body.content,
        author: req.body.author
    };

    MongoClient.connect(url, (err, db)=>{
        assert.equal(null, err);
        var dbo = db.db("form");
        dbo.collection('usertable').insertOne(item, (err, result)=>{
            assert.equal(null, err);
            console.log('Inserted');
            db.close();
        });
    });
res.redirect('/form');
});

app.listen(8080);

3 个答案:

答案 0 :(得分:0)

我相信您正面临这个问题,因为

  1. 您没有正确引用details数组内的对象。
  2. 您也不会在进入forEach循环之前声明结果对象。这将导致结果的值不确定。

在forEach循环中,每个“数据”都是一个对象。因此,在检查时,必须将id称为data._id。尝试为结果分配值时,类似data.item。

我修改了代码。这应该起作用。

app.get('/data',(req, res)=>{

    MongoClient.connect(url, (err, db)=>{
        assert.equal(null, err);
        var dbo = db.db("form");
        var details = dbo.collection('usertable').find();
        var result;
        details.forEach((data)=>{
            if(data._id == 5b5ef0b8e0d9c23c2012cef2){
                result = data.item;
                return true;
            }
        })
    });
res.render('customerdata',{item: result });
});

答案 1 :(得分:0)

需要注意的几件事:

  • MongoClient.connect()是异步的,但是您正在同步调用res.render()。
  • 通常,您不想在每次请求时都启动与MongoDB的连接。
  • 您可能应该执行dbo.collection('usertable').find().toArray(function(err, items) {...});来访问数据。

答案 2 :(得分:0)

find是异步的,您必须在find回调中返回结果,否则未定义:

app.get('/data',(req, res)=>{

    MongoClient.connect(url, (err, db)=>{

        assert.equal(null, err);
        var dbo = db.db("form");
        dbo.collection('usertable').find({}, function(err, details){

          if(err)
          {
               res.render('customerdata',{item: null });
          }
          else
          {
             var result = null;
             details.forEach((data)=>{

                 if(data._id.toString() == "5b5ef0b8e0d9c23c2012cef2"){

                     result = item;

                 }
              })
             res.render('customerdata',{item: result });
          }


        });

    });

此外,您的发帖请求有相同的错误,即在插入操作结束之前重定向用户。正确的代码是:

app.post('/form/submit', (req, res)=>{

    var item = {
        title: req.body.title,
        content: req.body.content,
        author: req.body.author
    };

    MongoClient.connect(url, (err, db)=>{
        assert.equal(null, err);
        var dbo = db.db("form");
        dbo.collection('usertable').insertOne(item, (err, result)=>{
            assert.equal(null, err);
            console.log('Inserted');
            db.close();
            res.redirect('/form');
        });
    });

});