【发布时间】:2019-03-08 03:22:06
【问题描述】:
我不确定是不是有什么我不明白的地方,或者有什么错误,但我就是想不通。基本上偶尔,我会从我的服务器向 API 发送一个请求,以获取一些信息,然后将其保存到我的数据库中,但是每当保存数据时,socket.io 请求就会被阻塞,并且只有当所有数据都被阻塞时已更新是当其他请求大量通过时。我知道他们被阻止了,因为我尝试在更新数据时每 100 毫秒发送一条聊天消息,并且只有当 API 中的最后一条信息被保存并且在它被保存时没有一条消息通过时,所有消息才通过保存。我怎样才能让它不阻止其他请求?
这是我测试时控制台输出的示例:
...
New chat message received
New chat message received
New chat message received
New chat message received
UPDATING 1455 ITEMS
UPDATED ALL PRICES, TOOK 3592
New chat message received
New chat message received
New chat message received
New chat message received
...
代码:
request('url')), (err, response, body) => {
let items = JSON.parse(body);
let startTime = new Date().getTime();
console.log(`UPDATING ${items.prices.length} ITEMS`);
for (let i = 0; i < items.prices.length; i++) {
const item = items.prices[i];
Prices.findOneAndUpdate({item: item.name}, {$set: {price: item.price, last_update: Date.now()}}, (err, res) => {
if(!res){
newPrice = new Prices({
item: item.name,
price: item.price
});
newPrice.save((err, saved) => {
if (err) {
console.log(err);
}
})
}
if(i == items.prices.length - 1){
console.log(`UPDATED ALL PRICES, TOOK ${new Date().getTime() - startTime}`);
}
});
}
});
不确定这是否会有所帮助,但这里是处理接收消息的代码:
socket.on('sendMessage', (data) => {
User.findOne({id: socket.request.user.id}, (err, user) => {
if (err) throw err;
//Check if the user is muted and if not, proceed
if(user.mutedUntil < Date.now()){
User.findOneAndUpdate({id: socket.request.user.id}, {$set: {lastMessageDate: Date.now()}}, (err, dbUser) => {
if (err) throw err;
let parsed = ParseMessage(data.message);
if(parsed.command === 'none'){
SendMessage(dbUser, socket, data);
}else{
commandData = {parsed: parsed, socket: socket}
ExecuteChatCommand(commandData);
}
});
}else{
socket.emit('serverMessage', {
type: 'error',
title: 'You\'re muted',
message: 'You are muted and can\'t chat until ' + user.mutedUntil
});
console.log('Muted user tried chatting');
}
});
});
【问题讨论】:
标签: node.js mongodb express mongoose socket.io