我是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  ' +
item.Employeeid + '</br>'
}
})
res.send(str)
client.close()
})
})
var server = app.listen(3000, function() {})
答案 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 + ' Employee id  ' +
item.Employeeid + '</br>'
}
})
res.send(str)
client.close()
})
})
旁注-您应该重用Mongo连接,而不是在每个请求上都调用connect
和close
。
答案 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 + ' Employee id  ' +
item.Employeeid + '</br>'
}
}
res.send(str)
str = '';
})
})
})
var server = app.listen(3000, function() {})
如果您不将res.send()
移入回调函数,则由于节点的异步性质,您可能会在从db获取数据之前发送结果。