我是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.emitio.emit正在发送给所有连接的客户端

要仅发射到连接的插座,请使用socket.emit



顺便说一句,您应该检查error是否不为空

10-05 21:08
查看更多