0

我是 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() {}) 
4

2 回答 2

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 获取数据之前发送结果。

于 2019-01-05T07:34:22.117 回答
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 连接,而不是在每个请求上调用connect和。close

于 2019-01-05T00:28:13.637 回答