У меня есть следующий код:узел JS Монго дб зависимостей (документ не найден)
var method = PushLoop.prototype;
var agent = require('./_header')
var request = require('request');
var User = require('../models/user_model.js');
var Message = require('../models/message_model.js');
var async = require('async')
function PushLoop() {};
method.startPushLoop = function() {
getUserList()
function getUserList() {
User.find({}, function(err, users) {
if (err) throw err;
if (users.length > 0) {
getUserMessages(users)
} else {
setTimeout(getUserList, 3000)
}
});
}
function getUserMessages(users) {
// console.log("getUserMessages")
async.eachSeries(users, function (user, callback) {
var params = {
email: user.email,
pwd: user.password,
token: user.device_token
}
messageRequest(params)
callback();
}, function (err) {
if (err) {
console.log(err)
setTimeout(getUserList, 3000)
}
});
}
function messageRequest(params) {
var url = "https://voip.ms/api/v1/rest.php?api_username="+ params.email +"&api_password="+ params.pwd +"&method=getSMS&type=1&limit=5"
request(url, function(err, response, body){
if (!err) {
var responseObject = JSON.parse(body);
var messages = responseObject.sms
if (responseObject["status"] == "success") {
async.eachSeries(messages, function(message, callback){
console.log(params.token)
saveMessage(message, params.token)
callback();
}, function(err) {
if (err) {
console.log(err)
}
// setTimeout(getUserList, 3000)
})
} else {
// setTimeout(getUserList, 3000)
}
} else {
console.log(err)
// setTimeout(getUserList, 3000)
}
});
setTimeout(getUserList, 3000)
}
function saveMessage(message, token) {
// { $and: [ { price: { $ne: 1.99 } }, { price: { $exists: true } }
// Message.find({ $and: [{ message_id: message.id}, {device_token: token}]}, function (err, doc){
Message.findOne({message_id: message.id}, function (err, doc){
if (!doc) {
console.log('emtpy today')
var m = new Message({
message_id: message.id,
did: message.did,
contact: message.contact,
message: message.message,
date: message.date,
created_at: new Date().toLocaleString(),
updated_at: new Date().toLocaleString(),
device_token: token
});
m.save(function(e) {
if (e) {
console.log(e)
} else {
agent.createMessage()
.device(token)
.alert(message.message)
.set('contact', message.contact)
.set('did', message.did)
.set('id', message.id)
.set('date', message.date)
.set('message', message.message)
.send();
}
});
}
}) //.limit(1);
}
};
module.exports = PushLoop;
Что на самом деле работает прекрасно в моей среде разработки - Однако в производстве (я использую OpenShift) в Mongo документы сохраняйте в бесконечном цикле, чтобы он выглядел так: условие (if (! doc)) всегда возвращает true, поэтому документ создается каждый раз. Не уверен, что это может быть проблема мангуста - я также попробовал метод «find» вместо «findOne». Мой dev env имеет узел 0.12.7, а Openshift имеет значение 0.10.x - это может быть проблемой, и я все еще изучаю, но если кто-нибудь может обнаружить ошибку, которую я не вижу в своей логике/коде, то дайте мне знать
спасибо!
Использование 'setTimeout' здесь довольно ужасно. Вы уже импортировали библиотеку 'async', поэтому используйте ее для управления потоком. Также использование '.findOne()' и '.save()' является ужасным образцом. Вместо этого вы должны применять '.update()' вместо атомных операторов. Но главное здесь, если вы «предположите», что вещи завершены через определенное время, тогда вы просто просите о неприятностях. Рефакторинг должен учитывать каждый обратный вызов. –
То, что я пытаюсь сделать здесь, - опросить сторонний сервер обмена сообщениями каждые несколько секунд для новых сообщений. Обычно сервер возвращает последние 10 сообщений, и я храню их в экземпляре mongo. Таким образом, цель запроса на поиск заключается в том, чтобы узнать, сохранил ли я это сообщение, если нет, а затем сохраните его в mongo. Так вы говорите, что если я использую update() вместо save(), mongo сохранит новый документ? спасибо за ваш ответ btw – fredp613
То, что я говорю, вы должны прочитать на ["upsert"] (http://docs.mongodb.org/manual/reference/method/db.collection.update/#upsert-option) вариант «найти или создать» - это в основном то, что он делает. Кроме того, даже если «опрос» вам не следует делать, пока вы не узнаете, что все обновления в цикле из ответа завершены. Если нет, вы рискуете, по крайней мере, создавать запросы в очереди и, возможно, даже переписывать данные. Но правильное исследование «.update()» и «upserts» и связанных с ними операторов должно помочь в этом. Ваш код нуждается в серьезном рефакторинге. –