我在NodeJS中处理2个已连接的Web应用程序。我们称它们为A和B。大多数都可以,但是...
在应用程序A中,有一个视频流,用户可以在表单中提问。我使用jquery和ajax提交表单并发送发布请求,该请求将一个问题插入MongoDB中-每个都作为单独的文档。 App B也使用jquery和ajax从集合中读取问题。它每5秒发出一次获取请求-我使用了setInterval
。然后我们开始。
当我同时启动这两个应用程序一段时间后,但应用程序A随机发送了一个帖子请求,其中包含先前添加的问题。有时应用B会删除数据库中的所有文档,等等。我想这背后有逻辑,但我看不到。
下面是有问题的代码段。
应用A
API部分:
index.post('/ask', (req, res) => {
var question = req.body.question;
var person = req.body.person;
mongo.connect(url, {useNewUrlParser:true}, (err, dbo) => {
if(err) return;
else{
var db = dbo.db('question');
db.collection('asked').insertOne({question:question, who:person}, (err) => {
if(err) return;
})
}
})
})
ajax部分:
$('#ask_question').on('submit', function(event) {
event.preventDefault();
event.stopImmediatePropagation();
var question = $('#inputDefault').val();
var who = $('#exampleSelect1').val();
console.log(question + ' '+ who);
$.ajax({
url: '/ask',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify({
question: question,
person:who
}),
success: function(response) {
console.log(response);
}
});
});
应用B
API:
index.get('/asked', (req, res) => {
mongo.connect(url, {useNewUrlParser:true}, (err, dbo) => {
if(err) return;
else{
var db = dbo.db('question');
db.collection('asked').find({}).toArray((err, result) => {
if(err) return;
if(!result) return;
else res.send(result);
})
}
})
})
ajax部分:
setInterval(()=>{
$.ajax({
url: '/asked',
method:'GET',
contentType: 'application/json',
async: false,
success: function(response) {
var form = $('#asked');
$('#asked').empty();
$.each(response, function(i, question) {
form.append('<li>'+question.question+ ' ('+question.who+')</li>');
});
}
});
},5000);
如果您想知道为什么我使用return
,那是因为我试图防止MongoDB崩溃。一段时间(例如15分钟左右)后,我收到错误消息:
.../node_modules/mongodb/lib/operations/mongo_client_ops.js:474
throw err;
^
Error: write EPIPE
at Object.exports._errnoException (util.js:870:11)
at exports._exceptionWithHostPort (util.js:893:20)
at WriteWrap.afterWrite (net.js:763:14)
在两个应用程序中都发生。我想这是一个简单的僵局,但不知道如何防止这种情况。
如果您愿意,我将提供项目的较大部分。我找不到解决这些问题的方法。