我是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
是否不为空