/ / Mongoose и командир - node.js, mongodb, mongoose

Монгоуз и командир - node.js, mongodb, mongoose

Пиша няколко скрипта за манипулиране на команден ред Mongoose модели с commander.js (в края на краищата бих искал да стартирам тези инструменти Cron).

Сега съм написал няколко скрипта commander и всички те работят добре, но ако се свържа с базата данни на MongoDB mongoose, те скрипта просто виси, след като е направено.Сега, аз помислих връзката на базата данни е поддържане възел жив, така че аз добавих mongoose.disconnect() линия и все още виси.

Единственото нещо, което намерих, което ми позволява да изключвам, е да го използвам process.exit(), но не искам просто да прекратя процеса. Има ли нещо специално, което трябва да направя, за да предизвикам грациозно изключване?

Отговори:

0 за отговор № 1

Моето четене на API документи това предполага .disconnect() трябва да да се даде функция за обратно извикване. Изглежда, че е призована за всеки, който е прекъснат и може да бъде пропуснат грешка.

Има проверка в кода, за да се уверите, че е такане се извиква, ако не съществува, когато нещата се развият, но тази проверка не се изпълнява от грешки, така че ако Mongoose получи съобщение за грешка от клиента на MongoDB, то може да оставя отворена връзка и затова " не спира изпълнението.

Ако отворите само една връзка към базата данни, може би просто искате да се обадите [Connection object].close() тъй като тази функция правилно въвежда не-оп "обратно извикване", ако не е дадено обратно повикване и изглежда, че ще разруши правилно нещата.

(Колкото повече гледам в Монгоуз, толкова повече искам просто да напиша тънка обвивка около клиента на MongoDB, така че не трябва да се занимавам с помощта на "Mongoose".)


0 за отговор № 2

Аз използвам асинхронен "Серия" за извършване на операции и след това повикване mongoose.connection.close () на завършване. Предотвратява обратната връзка и ви позволява да извършвате операции по един и същи начин едновременно или паралелно, последвано от функция, когато всички други методи са приключили. Аз го използвам през цялото време за скриптове, които изискват монгоуз, но трябва да се прекратят след приключване на всички операции на монгоуз.


0 за отговор № 3

Изключването на програмата за възли директно крие симптомите, а не решава проблема!

Най-накрая изолирах проблема и открих, че той е с дефиниции на Mongoose схема. Ако се опитате да изключите връзката твърде скоро, след като са дефинирани схемите за Mongoose1, приложението увисва и в крайна сметка създава някаква странна грешка, свързана с MongDB.

Добавяне на малко време, преди да стартирате program.parse(argv) за да стартирате командното приложение, поправя проблема. Просто увийте кода така:

var program  = require("commander")
, mongoose = require("mongoose")
, models   = null
;

// Define command line syntax.
program
.command(...)
;

mongoose.connect(
..., // connection parameters.

function() {
// connected to database, defined schemas.
models = require("./models");

// Wait 1 second before running the application code.
setTimeout(function(){
program.parser(process.argv);
}, 1000);
}
);

1: Това е моята първоначална интерпретация, не съм (все още) обстойно тествана тази теория. Обаче премахването на дефинициите на схеми на Mongoose от приложението успешно предотвратява окачването на приложението.


Всъщност просто използвайте process.nextTick() вместо setTimeout() обаждане поправя ситуацията добре!