node.js - nodejs:执行查找查询以选择需要异步运行的最后 n 条记录
问题描述
我是nodejs的新手。我想从 mongo 获取最后的 n 条记录,并在(n android)客户端连接时将它们写入套接字。我写了一些代码,当我在我拥有的 vps 上测试它时没问题,但是,在移动到新的 vps 后出现了问题。当第一个客户端连接到套接字时,它不会获取记录。但是,如果第二个客户端连接到套接字,则查找查询会再次运行,并且第一个客户端可以看到相关的发出,但是,对于第二个客户端来说不是!
我在 io.emit 命令之后添加了一个日志,它为每个连接的客户端运行。
我还添加了另一个发射,它只发送一个测试文本,并在他连接后立即传递给客户端。
我的代码:
const express = require('express'),
http = require('http'),
app = express(),
server = http.createServer(app),
io = require('socket.io').listen(server);
app.get('/', (req, res) => {
res.send('Chat Server is running on port ......')
});
var mongoose = require('mongoose');
var ChatMessage = require('./chatmessage');
var chatsdb = "mongodb://localhost:27017/chatsdb"
mongoose.connect(chatsdb, {useNewUrlParser: true});
mongoose.connection.on('connected', function () {
console.log('Mongoose connected!')
});
mongoose.connection.on('error', function (err) {
console.log('Mongoose default connection error:' + err);
});
io.on('connection', (socket) => {
let userId = socket.id;
console.log('user ' + userId + ' connected');//it always run
io.emit('connected_message', {"message_text": "ok!" , "user_id":userId});//it always run
ChatMessage.find().sort({created_at:-1}).limit(10).exec(function (err, posts) {
let list_of_messages = [];
for (let i = 0; i < posts.length; i++) {
if (posts[i] != null) {
let message = new ChatMessage({"message_text": posts[i].message_text, "name": posts[i].name , "created_at": posts[i].created_at});
list_of_messages.push(message);
}
}
io.emit('last_fifty_message', list_of_messages);
console.log("list_of_messages:" + list_of_messages); //it always run
});
});
server.listen(50000, () => {
console.log('Node app is running on port 50000')
});
它是 ChatMessage 类:
var mongoose = require('mongoose');
const Schema = mongoose.Schema;
var ChatMessageSchema = new Schema({
name : { type: String, require:true },
message_text : { type: String , require:true },
created_at : { type:Date , default: Date.now },
message_id : { type: Number , autoIncrement:true }
});
ChatMessageSchema.pre('save',function(next){
this.created_at = new Date();
console.log('this.created_at : '+this.created_at)
next();
});
var ChatMessage = mongoose.model('ChatMessage' , ChatMessageSchema);
module.exports = ChatMessage;
我不明白。如果查找记录是一个漫长的过程,它是如何记录但不发出的,为什么它会为已经连接的客户端发出?
它需要异步运行吗?我可以使用异步/等待或回调或...??
解决方案
您正在使用io.emit
,io.emit
正在发送到所有连接的客户端
仅发射到连接的套接字使用socket.emit
顺便说一句,您应该检查error
Is not null
推荐阅读
- pytorch - pytorch张量排序的算法是什么
- java - Java中的void方法| BankAccount 类构造函数
- python - 使用python将文件从一个位置移动到另一个位置
- c++ - 读写后从流中返回相同的数据 с++
- javascript - 用 Jest 测试跨浏览器扩展,如何模拟 Chrome 存储 API?
- python - QGridLayout中的QScrollArea
- python - 找到两个字符串之间的重叠范围
- android - 任务 ':hardware_buttons:compileDebugKotlin' 执行失败 > 编译错误
- python - 我正在使用 google colab,一切都是最新的,但仍然出现此错误 TypeError: drop() got an unexpected keyword argument 'axis'
- scala - 在 Scala 中检查线性时间的数组内容相等性