Данные не отображаются с первой попытки только после обновления - PullRequest
0 голосов
/ 05 января 2019

Я новичок в нодах, экспрессах и монго, поэтому мне нужно некоторое руководство. Я создал базу данных Монго с 3 объектами. Я создал приложение с маршрутом, так что 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 голосов
/ 05 января 2019

Причина, по которой вы получаете повторяющиеся результаты, заключается в том, что вы не делаете 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() в функцию обратного вызова, вы можете отправить результат до получения данных из БД из-за асинхронной природы узла.

0 голосов
/ 05 января 2019

Вы добавляете к 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 при каждом запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...