【问题标题】:MongoDB get data to display in HTMLMongoDB 获取数据以 HTML 格式显示
【发布时间】:2017-04-18 12:16:01
【问题描述】:

我正在尝试在我的 html 页面中显示 mongodb 数据。我已经设法在 db 中插入数据,但由于某种原因,我的“get”功能不起作用。

我将 node.js 与 express 框架和 Angular 一起用于前端和路由。

这是我从 MongoDB 中检索数据的“get”函数:

var mongo = require('mongodb');
var assert = require('assert');

var url = 'mongodb://localhost:27017/loodgieters';

router.get('/get-data', function(req, res, next) {
  var resultArray = [];
  mongo.connect(url, function(err, db){
    assert.equal(null, err);
    var cursor = db.collection('user-data').find();
    cursor.forEach(function(doc, err){
      assert.equal(null, err);
      resultArray.push(doc);
    }, function(){
      db.close();
      res.render('index', {items: resultArray});
    });
  });
});

我的“帖子”有效

router.post('/insert', function(req, res, next) {
  var item = {
    name: req.body.name,
    adress: req.body.adress,
    postal: req.body.postal,
    city: req.body.city,
    email: req.body.email,
    phone: req.body.phone,
    quotation: req.body.quotation,
    message: req.body.message
  };
  mongo.connect(url, function(err, db) {
    assert.equal(null, err);
    db.collection('user-data').insertOne(item, function(err, result){
      assert.equal(null, err);
      console.log('Item inserted');
      db.close();
    });
  });
  res.redirect('/contact');
});

【问题讨论】:

  • 你是直接用node-mongodb-native驱动还是用猫鼬?
  • 我使用的是node mongodb native。不是猫鼬
  • 它如何“不起作用”?抛出任何错误?

标签: javascript angularjs node.js mongodb express


【解决方案1】:

我不确定这是否是您每次尝试查询时打开和关闭 mongo 连接的正确方法。 如果您想采用另一种方法,请使用猫鼬 并遵循这样的事情 https://pastebin.com/g7aatzzj

【讨论】:

    【解决方案2】:

    我认为您的 .find().forEach 函数回调有误。错误处理似乎在 endCallback 而不是 iteratorCallback。

    根据official doc,正确的方法应该是:

    var mongo = require('mongodb');
    var assert = require('assert');
    
    var url = 'mongodb://localhost:27017/loodgieters';
    
    router.get('/get-data', function(req, res, next) {
      var resultArray = [];
      mongo.connect(url, function(err, db){
        assert.equal(null, err);
        var cursor = db.collection('user-data').find({});
        cursor.forEach(function(doc){
          assert.notEqual(null, doc);
          resultArray.push(doc);
        }, function(err, doc){
          assert.equal(null, err);
          db.close();
          res.render('index', {items: resultArray});
        });
      });
    });
    

    这个也可以找到in their unit tests

        var cursor = collection.find({})
          .map(function(x) { return {a:1}; })
          .batchSize(5)
          .limit(10);
        cursor.forEach(function(doc) {
          test.equal(1, doc.a);
        }, function(err, doc) {
          test.equal(null, err);
          db.close();
          test.done();
        });
    

    我认为你一定有一个错误没有传递给第一个回调并且没有在第二个回调中处理。所以你看不到错误。

    【讨论】:

      【解决方案3】:

      尝试在find()函数中插入一个空对象,如下:

      var cursor = db.collection('user-data').find({});

      【讨论】:

        【解决方案4】:

        我刚刚运行了您的代码并为我的目的对其进行了一些修改。 请找到以下sn-p

        //Instantiate MongoClient
        var mongo = require('mongodb').MongoClient;
        //Assert library (Perhaps overkill if you are writing production-level code)
        var assert = require('assert');
        //Express engine
        var express = require('express');
        
        //URL for my mongo instance
        //Connecting to the blog database
        var url = 'mongodb://localhost:27017/blog';
        
        //Instantiate express
        var router = express();
        
        //Get operation
        router.get('/get', function(req, res, next) {
          var resultArray = [];
          mongo.connect(url, function(err, db){
            assert.equal(null, err);
            var cursor = db.collection('posts').find();
            cursor.forEach(function(doc, err){
              assert.equal(null, err);
              resultArray.push(doc);
            }, function(){
              db.close();
              //I have no index file to render, so I print the result to console
              //Also send back the JSON string bare through the channel
              console.log(resultArray);
              res.send(resultArray);
            });
          });
        });
        
        //Start listeninig
        //Hardcoded port 1000
        var server = router.listen(1000, function() {
            var host = server.address().address;
            var port = server.address().port;
            console.log("Content Provider Service listening at http://%s:%s", host, port);
        });
        

        因此,让这个为你工作:

        1. 将网址更改为'mongodb://localhost:27017/loodgieters';
        2. 将路由器更改为'/get-data'

        我希望这会有所帮助! 还可以考虑使用将 get 操作的实现拆分到另一个模块来帮助实现职责分离,从而使您的代码更加健壮。

        【讨论】:

        • 除此之外,请确保在您部署到特定域之前允许跨域脚本。
        • process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With'); // 拦截 OPTIONS 方法 if ('OPTIONS' == req.method) { res.send(200); } 其他 { 下一个(); } }; router.use(allowCrossDomain);
        • 不知何故,这也不起作用。我什至没有在 console.log() 中得到任何响应。这可能是我的角度问题吗?因为我使用 Angular 进行前端路由并使用 express 呈现我的单个 index.html 文件。
        • var cursor = db.collection('user-data').find({});确保你也改变了它——这是一个轻微的疏忽。您的 Angular JS 应该使用对 nodejs 应用程序的常规 ajax 调用,它应该与典型的 Web 服务调用完全不同
        • 我已经更改了该行,但仍然无法正常工作。但是,如果我删除 router.get('/getdata') 函数,它会以某种方式工作
        猜你喜欢
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        • 2017-11-25
        相关资源
        最近更新 更多