У меня есть экспресс-приложение, работающее с Sequelize.js как ORM. Мое экспресс-приложение получает запросы от моего основного приложения Rails, и из-за междоменной политики эти запросы выполняются с помощью getJSON.Бэкэнд ExpressJS со слишком большим количеством запросов
На клиенте запрос запускается, когда пользователь нажимает клавишу. Все идет хорошо и выражает журналы выполняемых запросов (и json, обслуживаемых) каждый раз, когда пользователь нажимает клавишу. Даже пытаясь быстро ударить, он работает нормально. Но всякий раз, когда я оставляю клавишу нажатой (или, может быть, несколько клиентов нажимают клавишу очень быстро), когда она начинает запускать множество запросов, в какой-то момент сервер просто зависает, все запросы с этого момента остаются в ожидании (я вижу, что на вкладке Сеть в Chrome Dev Tools), и они медленно начинают таймаут. Мне нужно перезагрузить сервер, чтобы он снова ответил.
Серверный код для моего запроса:
models.Comment.findAllPublic(req.params.pId, req.params.sId, function(comments){
var json = comments.map(function(comment){
var com = {};
['user_id','user_avatar', 'user_slug', 'user_name', 'created_at', 'text', 'private', 'is_speaker_note'].forEach(function(key){
com[key]=comment[key];
});
return com;
});
res.json({comments: json});
});
И метод findAllPublic от модели Комментарий (это модель Sequelize) является:
findAllPublicAndMyNotes: function(current_user, presentationId, slideId, cb){
db.query("SELECT * FROM `comments` WHERE commentable_type='Slide' AND commentable_id=(SELECT id from `slides` where `order_in_presentation`="+slideId+" AND `presentation_id`="+presentationId+") AND (`private` IS FALSE OR (`private` IS TRUE AND `user_id`="+current_user+" AND `is_speaker_note` IS FALSE))",self.Comment).on('success', cb).on('failure',function(err){console.log(err);});
}
Как избежать сервер от получения застрял? Могу ли я оставить код блокировки в запросе, который может медленно повесить сервер, когда будут сделаны новые запросы?
Сначала я думал, что это может быть проблемой из-за «forEach» при создании объекта json из Sequelize-модели, но я также попытался оставить обратный вызов для запроса mysql пустым, просто ответил пустой json, и он также получил замораживали.
Возможно, это проблема соединителя mysql? Когда сервер застревает, я могу нормально запускать консоль mysql и выполнять запросы в моей базе данных, и он также отвечает, поэтому я не знаю, проблема в этом.
Я знаю, что могу просто управлять ключевым событием, чтобы он не запускал слишком много запросов, когда ключ нажимается в течение длительного времени, но проблема, похоже, появляется также, когда несколько клиентов нажимают клавишу повторно и одновременно.
Любые мысли? Заранее спасибо за помощь: D
Вы создаете что-то вроде autosuggest? –