仅在刷新后才尝试显示数据

时间:2019-01-05 00:23:35

标签: node.js mongodb express

我是node,express和mongo的新手,所以我需要一些指导。我建立了一个包含3个对象的mongo数据库。我创建了一个带有路由的应用程序,以便http://localhost:3000/Employeeid将导致页面显示数据库中的所有3个对象,页面将执行此操作。但是,对于每个后续刷新,基于刷新次数,同一数据将显示多次。 (即,对于第一次刷新,数据重复一次。对于第二次刷新,数据重复两次。)有人知道这可能是什么问题吗?

var express = require('express')
var app = express()
var MongoClient = require('mongodb').MongoClient
var url = 'mongodb://localhost:27017'
var str = ''

 app.route('/Employeeid').get(function(req, res) {
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, client) {
        var db = client.db('EmployeeDB')
        var cursor = db.collection('Employee').find()
        cursor.forEach(function(item) {
            if (item != null) {
                str = str + '    Employee id&nbsp ' +
                item.Employeeid + '</br>'
             }
        })
        res.send(str)
        client.close()
    })
})

var server = app.listen(3000, function() {}) 

2 个答案:

答案 0 :(得分:1)

每次调用str路由时,您都将附加到/EmployeeId上。要解决此问题,请在回调内移动str

app.route('/Employeeid').get(function(req, res) {
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, client) {
        var str = ''
        var db = client.db('EmployeeDB')
        var cursor = db.collection('Employee').find()
        cursor.forEach(function(item) {
            if (item != null) {
                str = str + '&nbsp;&nbsp;&nbsp;&nbsp;Employee id&nbsp&nbsp;' +
                item.Employeeid + '</br>'
             }
        })
        res.send(str)
        client.close()
    })
})

旁注-您应该重用Mongo连接,而不是在每个请求上都调用connectclose

答案 1 :(得分:1)

获得重复结果的原因是,发送结果后没有获得str = null。您正在为每个请求串联str,因为str是全局变量。您可以像这样修改代码以提高性能。

var express = require('express')
var app = express() 
var MongoClient = require('mongodb').MongoClient
var url = 'mongodb://localhost:27017'
var str = ''
var db = null
MongoClient.connect(url, { useNewUrlParser: true }, function(err, client) {
    if( err ) {
       throw new Error( err );
     }

    db = client.db('EmployeeDB') // we are storing db reference in global variable db

    });

app.route('/Employeeid').get(function(req, res) {
    db.collection('Employee').find().toArray( function(err, cursor){
       if( err ) {
                res.send('');
                throw new Error(err );
       }

       cursor.forEach(function(item) {
        if (item != null) {
            str = str + '&nbsp;&nbsp;&nbsp;&nbsp;Employee id&nbsp&nbsp;' +
            item.Employeeid + '</br>'
         }
    }
    res.send(str)
    str = '';


  })

})
})

var server = app.listen(3000, function() {}) 

如果您不将res.send()移入回调函数,则由于节点的异步性质,您可能会在从db获取数据之前发送结果。