javascript - mongoDB 通过 find 得到“未定义”
问题描述
我想使用所有的值
bericht.find({
room: room
}).toArray(function(err, docs) {
assert.equal(err, null);
str2 = str2 + docs.message;
这个函数可以找到,唯一的问题是我不断得到'未定义'。但我想使用值和 socket.emit 值到客户端大小,以便可以在那里使用所有消息。有谁能够帮助我?我怎么能做到这一点。
const url = 'mongodb://localhost:27017';
io.on('connection', (socket) => {
var str2 = [];
// Database Name
const dbName = 'chatapplication';
const findMessageFromRoom = function(room, db, callback) {
// Get the messages from certain room
const bericht = db.collection('Bericht');
// Find some documents
bericht.find({
room: room
}).toArray(function(err, docs) {
assert.equal(err, null);
str2 = str2 + docs.message;
// callback(docs);
});
console.log(str2);
socket.emit('test1', str2);
};
function getAllMessagesInRoom(room) {
MongoClient.connect(url, function(err, client) {
assert.equal(null, err);
console.log("Connected successfully to server");
const db = client.db(dbName);
findMessageFromRoom(room, db, function() {
client.close();
});
});
}
)
};
解决方案
Node.js 是异步的,它不会等待数据库查询完成,只是str2
立即记录变量。它当时没有定义,所以你会在控制台上收到“未定义”消息。
像这样使用它:
bericht.find({
room: room
}).toArray(function(err, docs) {
assert.equal(err, null);
str2 = str2 + docs.message;
// callback(docs);
console.log(str2);
socket.emit('test1', str2);
});
推荐阅读
- docker - 使用 dotnet:2.1-sdk 在 docker 容器中构建 dotnet 失败
- enterprise-architect - Sparx EA VBScript。如何“someInformationFlow.ConveyedItems.AddNew”?
- winforms - 配对 BLE 设备
- string - POSIX sh:如何仅使用 shell 将整个文件读入单个字符串,同时在原始文件中保留空格和换行符?
- javascript - 从颜色选择器 Three.js 中选择颜色
- git - 如何从 .gitignore 子文件夹中排除所有扩展名(但不包括 PHP 和 JS)?
- php - PHP 如何在 csv 文件中打印数组?
- mariadb - MariaDB 生成列 vs. 内置函数,哪个更快?
- elasticsearch - 估计弹性搜索索引大小的最佳方法
- c# - 如何从实体框架数据库中获取包含在类中的项目列表