Mongoose: "์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ ์‹œ ์—ฐ๊ฒฐ ์‹คํŒจ" ์ดํ›„์—๋Š” ์žฌ์‹œ๋„๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 04์›” 17์ผ  ยท  40์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Automattic/mongoose

๊ธฐ๋ณธ์ ์œผ๋กœ mongoose๋Š” ์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋…ธ๋“œ๊ฐ€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๋ฒ„๊ทธ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๋ฉด ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ์— ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

db.on('error', console.error.bind(console, 'connection error:'));

์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด ๋ฒ„๊ทธ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. MongoDB ์ข…๋ฃŒ
  2. ๋ชฝ๊ตฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ ์•ฑ ์‹œ์ž‘
  3. ์•ฑ์—์„œ ๊ธฐ๋กํ•  ํ•ญ๋ชฉ: [MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]]
  4. MongoDB๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.
  5. mongoose๊ฐ€ ์ด์ œ ์ž‘๋™ ์ค‘์ธ MongoDB์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์•ฑ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ˆ˜๋™ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘: autoreconnect ๊ธฐ๋ณธ๊ฐ’์€ true์ด๋ฏ€๋กœ MongoDB์— ๋‹ค์‹œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์ฆ‰์‹œ mongoose๊ฐ€ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ์— ์„ฑ๊ณตํ–ˆ์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ์ค‘์— MongoDB์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ์ž๋™ ์žฌ์—ฐ๊ฒฐ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์•ฑ์ด ์‹œ์ž‘๋  ๋•Œ MongoDB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ถˆ์ผ์น˜์ž…๋‹ˆ๋‹ค.

(์ด๊ฒƒ์ด ์›ํ•˜๋Š” ๋™์ž‘์ด๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜์ง€ ์•Š๊ณ  ๋…ธ๋“œ ์ถฉ๋Œ์„ ํ—ˆ์šฉํ•˜์—ฌ ์ด ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š” ๊ฒฝ์šฐ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.)

๋…ธ๋“œ v4.4.1, [email protected] , [email protected] , [email protected]

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ฒ˜์Œ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•  ๋•Œ ์ž๋™ ์žฌ์—ฐ๊ฒฐ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

function createConnection (dbURL, options) {
    var db = mongoose.createConnection(dbURL, options);

    db.on('error', function (err) {
        // If first connect fails because mongod is down, try again later.
        // This is only needed for first connect, not for runtime reconnects.
        // See: https://github.com/Automattic/mongoose/issues/5169
        if (err.message && err.message.match(/failed to connect to server .* on first connect/)) {
            console.log(new Date(), String(err));

            // Wait for a bit, then try to connect again
            setTimeout(function () {
                console.log("Retrying first connect...");
                db.openUri(dbURL).catch(() => {});
                // Why the empty catch?
                // Well, errors thrown by db.open() will also be passed to .on('error'),
                // so we can handle them there, no need to log anything in the catch here.
                // But we still need this empty catch to avoid unhandled rejections.
            }, 20 * 1000);
        } else {
            // Some other error occurred.  Log it.
            console.error(new Date(), String(err));
        }
    });

    db.once('open', function () {
        console.log("Connection to db established.");
    });

    return db;
}

// Use it like
var db = createConnection('mongodb://...', options);
var User = db.model('User', userSchema);

๋ชฝ๊ตฌ์Šค < 4.11์˜ ๊ฒฝ์šฐ db.open() ๋Œ€์‹  db.openUri()
mongoose 4.11.7์˜ ๊ฒฝ์šฐ ์ด ๊ธฐ์ˆ ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ชฝ๊ตฌ์Šค 4.13.4์˜ ๊ฒฝ์šฐ ๋‹ค์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!


ํŽธ์ง‘ 2019/09/02: promiseRetry here ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋” ์งง์€ ์†”๋ฃจ์…˜ ๋„

๋ชจ๋“  40 ๋Œ“๊ธ€

ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋…ธ๋“œ 6, 7, ๋ชฝ๊ตฌ์Šค(์ตœ์†Œ 6๊ฐœ์›”), ๋ชฝ๊ณ  3.2 - 3.4
์ด๊ฒƒ๊ณผ ํ•จ๊ป˜ํ•ฉ๋‹ˆ๋‹ค #4890

mongodb-core ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์‹œ๋„๊ฐ€ ์‹คํŒจํ•˜๋”๋ผ๋„ ๋‹ค์‹œ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ํ›„์† ์‹œ๋„์™€ ์™œ ๋‹ค๋ฅธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ๋„ ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ „์ฒด ์žฌํ˜„ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

const mongoose = require('mongoose');
const co = require('co');
mongoose.Promise = global.Promise;
const GITHUB_ISSUE = `gh-5169`;


exec()
  .catch(error => {
    console.error(`Error: ${ error }\n${ error.stack }`);
  });


function exec() {
  return co(function*() {
    const db = mongoose.createConnection(`mongodb://localhost:27017/${ GITHUB_ISSUE }`);
    db.on('error', (error) => {
      console.error(`in an error ${ error }\n${ error.stack }`);
    })
  });
}

์žฌํ˜„ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” mongodb-core๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค. ์ด๊ฒƒ์€ ๋“œ๋ผ์ด๋ฒ„ ์˜

๋“œ๋ผ์ด๋ฒ„๋Š” ํ˜ธ์ŠคํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ์—์„œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ํ˜ธ์ŠคํŠธ์—์„œ ๋น ๋ฅธ ์‹คํŒจ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์žฌ์—ฐ๊ฒฐ ๋™์ž‘์€ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ดˆ๊ธฐ ์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰ํ•œ ํ›„์—๋งŒ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

๋ฌด์—‡์„ ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•˜๊ณ  ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋„๋ก ์˜๋„์ ์œผ๋กœ ์„ค๊ณ„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์šด์ „์ž์™€ ๋‹ค๋ฅธ ํ–‰๋™์„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๊ทธ๋Ÿฐ ํ–‰๋™์€ ์ˆ˜์ค€์ด ๋‚ฎ์€ ์šด์ „์ž์—๊ฒŒ ํ•ฉ๋‹นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ˆ˜๋กœ ์ž˜๋ชป๋œ ํ˜ธ์ŠคํŠธ๋‚˜ ์ž˜๋ชป๋œ ํฌํŠธ์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ชฝ๊ตฌ์Šค์—์„œ ์ข€ ๋” ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž๋™ ์žฌ์—ฐ๊ฒฐ ์˜ต์…˜์ด ํ™œ์„ฑํ™”๋˜๋ฉด Mongo ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์žฌ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค(์œ„์— ๋งํฌ๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ตฌ์ถ•ํ•˜์—ฌ).
  • mongoose๊ฐ€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ์ด ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๋Š” ์ ์–ด๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    (์˜ˆ: 30์ดˆ๋กœ ๋กœ๊ทธ๋ฅผ ์—ฐ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ง์ ‘ ๋กœ๊น… ๋Œ€์‹  error ๊ฒฝ๊ณ  ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด์•ผ ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž๋™์œผ๋กœ ์žฌ์ ‘์†์„ ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

์ œ ๊ธฐ์–ต์ด ๋งž๋‹ค๋ฉด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ช‡ ๋ฒˆ์˜ ์‹คํŒจ ํ›„ ๋งˆ์นจ๋‚ด ์—ฐ๊ฒฐํ–ˆ์„ ๋•Œ ์•ฑ์—์„œ ์ด๋ฏธ ํ์— ๋Œ€๊ธฐ ์ค‘์ธ ์ฟผ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ๊ดœ์ฐฎ์€ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ธฐ๋Šฅ ์š”์ฒญ์ด๋ผ๊ณ  ๋ผ๋ฒจ์„ ๋ถ™์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์ดˆ๊ธฐ ์—ฐ๊ฒฐ์—์„œ ๋น ๋ฅด๊ฒŒ ์‹คํŒจํ•˜๋Š” ๊ฒƒ์€ MongoDB ๋“œ๋ผ์ด๋ฒ„ ์ „์ฒด์—์„œ ๋งค์šฐ ์ผ๊ด€๋œ ๋™์ž‘์ด๋ฉฐ mongoose๊ฐ€ ์ด๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ์—๋Š” ํฐ ์ด์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

Strongloop Loopback mongodb ์ปค๋„ฅํ„ฐ์˜ ์ด ์ตœ๊ทผ ๊ฒŒ์‹œ๋ฌผ ์€ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. lazyConnect ํ”Œ๋ž˜๊ทธ๋Š” ๋์ ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ์„ ์—ฐ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•˜๋ฉด ๊ธฐ๋ณธ ์—ฐ๊ฒฐ ๋Š๊น€ ์„ค์ • ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค(์žฌ์‹œ๋„).

๋‚ด ๊ด€์‹ฌ์€ "์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์ˆœ์„œ"๋ฅผ ์„ค์ •ํ•˜๊ณ  ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ "์„œ๋น„์Šค ๊ฐ€์šฉ์„ฑ ์ˆœ์„œ"๋Š” ์„ค์ •ํ•  ์ˆ˜ ์—†๋Š” ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์ž…๋‹ˆ๋‹ค. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋„๊ตฌ๋Š” mongo ์„œ๋น„์Šค๋ฅผ ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ mongo ์ปจํ…Œ์ด๋„ˆ๊ฐ€ "์ž‘๋™"๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด mongo ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ 1์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ์ง€๋งŒ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๋ฐ 5์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ณ  ๋‚ด ์•ฑ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ 1์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ณ  ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๋ฐ 1์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด ์•ฑ ์„œ๋น„์Šค๊ฐ€ mongo ์„œ๋น„์Šค๋ฅผ ๋Šฅ๊ฐ€ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ์„ค๋ช…๋œ ๋Œ€๋กœ .

Docker Compose ์„ค๋ช…์„œ ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

Compose๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ "์ค€๋น„"๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ (ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ด๋“  ๊ฐ„์—) ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ทธ๋Ÿด๋งŒํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ค€๋น„๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ํ›จ์”ฌ ๋” ํฐ ๋ฌธ์ œ์˜ ์ผ๋ถ€์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์–ธ์ œ๋“ ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๊ฑฐ๋‚˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์‹คํŒจ์— ํƒ„๋ ฅ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‹คํŒจ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ์žฌ์„ค์ •์„ ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์—ฐ๊ฒฐ์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜๋ฉด ๊ฒฐ๊ตญ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ์‹œ์ž‘ ์‹œ์™€ ์–ด๋–ค ์ด์œ ๋กœ ์—ฐ๊ฒฐ์ด ๋Š๊ธธ ๋•Œ๋งˆ๋‹ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ ์ด ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰

๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜๊ณผ ๊ด€๋ จํ•˜์—ฌ ์—ฌ๊ธฐ์—๋Š” ๋ถ„๋ช…ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ ๋‹ค์Œ ๋‘ ์ž…์žฅ ๋ชจ๋‘ ์œ ํšจํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

  1. Mongoose๋Š” ์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ์—์„œ ์žฌ์‹œ๋„ํ•˜๋Š” ์˜ต์…˜์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ผ๋ถ€ ์ฃผ์˜ ๋ฌธ์„œ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ false๋กœ ์„ค์ •๋จ).
  2. Mongoose๋Š” ์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•  ๊ฒฝ์šฐ ์žฌ์‹œ๋„ํ•  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊ฐ„๊ฒฉ์ด ์žˆ์ง€๋งŒ ์ดˆ๊ธฐ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•  ๊ฒฝ์šฐ ์žฌ์‹œ๋„ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ฑ…์ž„์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ชฝ๊ตฌ์Šค๋Š” ๊ทธ๊ฒƒ์ด ์‹คํŒจํ–ˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜(๋˜๋Š” ์ด์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ปจํ…์ŠคํŠธ)์—์„œ docker compose๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์˜์‹ฌ์Šค๋Ÿฌ์šด ๊ฒฐ์ •์„ ๋‚ด๋ฆฐ ๊ฒฝ์šฐ ์ดˆ๊ธฐ ์—ฐ๊ฒฐ ์‹คํŒจ ์žฌ์‹œ๋„๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํƒ ์Šค 2, ๊ทธ๋Ÿผ.

์ฒ˜์Œ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•  ๋•Œ ์ž๋™ ์žฌ์—ฐ๊ฒฐ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

function createConnection (dbURL, options) {
    var db = mongoose.createConnection(dbURL, options);

    db.on('error', function (err) {
        // If first connect fails because mongod is down, try again later.
        // This is only needed for first connect, not for runtime reconnects.
        // See: https://github.com/Automattic/mongoose/issues/5169
        if (err.message && err.message.match(/failed to connect to server .* on first connect/)) {
            console.log(new Date(), String(err));

            // Wait for a bit, then try to connect again
            setTimeout(function () {
                console.log("Retrying first connect...");
                db.openUri(dbURL).catch(() => {});
                // Why the empty catch?
                // Well, errors thrown by db.open() will also be passed to .on('error'),
                // so we can handle them there, no need to log anything in the catch here.
                // But we still need this empty catch to avoid unhandled rejections.
            }, 20 * 1000);
        } else {
            // Some other error occurred.  Log it.
            console.error(new Date(), String(err));
        }
    });

    db.once('open', function () {
        console.log("Connection to db established.");
    });

    return db;
}

// Use it like
var db = createConnection('mongodb://...', options);
var User = db.model('User', userSchema);

๋ชฝ๊ตฌ์Šค < 4.11์˜ ๊ฒฝ์šฐ db.open() ๋Œ€์‹  db.openUri()
mongoose 4.11.7์˜ ๊ฒฝ์šฐ ์ด ๊ธฐ์ˆ ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ชฝ๊ตฌ์Šค 4.13.4์˜ ๊ฒฝ์šฐ ๋‹ค์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!


ํŽธ์ง‘ 2019/09/02: promiseRetry here ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋” ์งง์€ ์†”๋ฃจ์…˜ ๋„

์•ˆ๋…•ํ•˜์„ธ์š” @vkarpov15 ์ด ๊ฒฝ์šฐ mongodb-core ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๊ฑฐ๋ถ€๋„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]
    at Pool.<anonymous> (/Users/development/okkralabs/sem-server/services/sem-access/node_modules/mongodb-core/lib/topologies/server.js:336:35)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at Connection.<anonymous> (/Users/development/okkralabs/sem-server/services/sem-access/node_modules/mongodb-core/lib/connection/pool.js:280:12)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/Users/development/okkralabs/sem-server/services/sem-access/node_modules/mongodb-core/lib/connection/connection.js:187:49)
    at Object.onceWrapper (events.js:315:30)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211:7)
    at emitErrorNT (internal/streams/destroy.js:64:8)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)

์ด๊ฒƒ์€ ์žฌํ˜„ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” MongoDb ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ด ๋ณด์‹ญ์‹œ์˜ค.

(node:2545) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]
(node:2545) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

์ฒ˜๋ฆฌํ•  ๋ฐฉ๋ฒ•์ด ์žˆ๋‚˜์š”?

@jorgearanda ์–ด๋–ค ๋ฒ„์ „์˜ mongoose๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@vkarpov15 @jorgecuesta๋ฅผ ์œ„ํ•œ ๋ฉ”์‹œ์ง€์ธ ๊ฒƒ ๊ฐ™์€๋ฐ์š” ?

์ด๋Ÿฐ, ๋‚ด ์‹ค์ˆ˜. ์–ด๋ฆฌ์„์€ github ์ž๋™ ์™„์„ฑ, ์˜ˆ, @jorgecuesta ๋ฅผ ์œ„ํ•œ

@jorgecuesta ์™€ ๋˜‘๊ฐ™์€ ๊ฒƒ์„ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” 4.11.5๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ 5.0.0-rc2์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ชจ๋ธ์ด ๋™์ผํ•œ mongo ์ธ์Šคํ„ด์Šค์—์„œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ createConnection์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. mongo๊ฐ€ ๋‹ค์šด๋œ ์ƒํƒœ์—์„œ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

2018-01-07 13:05:23-05:00: [INFO] database - reusing existing connectioun for mongodb://localhost/eiss
2018-01-07 13:05:23-05:00: [INFO] database - initializing database connection to: mongodb://localhost/eiss
2018-01-07 13:05:23-05:00: [INFO] database - reusing existing connectioun for mongodb://localhost/eiss
2018-01-07 13:05:23-05:00: [ERROR] database - Mongoose connection error: MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]
Unhandled rejection MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]
    at Pool.<anonymous> (/Users/bill/eiss4/js/node_modules/mongoose/node_modules/mongodb-core/lib/topologies/server.js:503:11)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at Connection.<anonymous> (/Users/bill/eiss4/js/node_modules/mongoose/node_modules/mongodb-core/lib/connection/pool.js:326:12)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/Users/bill/eiss4/js/node_modules/mongoose/node_modules/mongodb-core/lib/connection/connection.js:245:50)
    at Object.onceWrapper (events.js:315:30)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211:7)
    at emitErrorNT (internal/streams/destroy.js:64:8)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)

๋ชจ๋ธ์€ ์‚ฌ์šฉ ์ค‘์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„์œผ๋กœ ์—ฐ๊ฒฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค(์•„๋ž˜ ์ฐธ์กฐ). ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋  ๋•Œ mongo๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์œ„์•„๋ž˜๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ฌธ์ œ ์—†์ด ๋‹ค์‹œ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค(์˜ค๋ฅ˜ ๊ธฐ๋ก). ์ด ๋ฌธ์ œ๋ฅผ ์ฝ๊ณ  ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ดˆ๊ธฐ ์—ฐ๊ฒฐ์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ผ์ข…์˜ ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค. @joeytwiddle ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ์ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•  ๊ฒƒ

const allConnections = {};

module.exports = function(dbName) {
  const url = 'http://localhost/' + dbName;
  let conn;
  log.info('initializing database connection to: ' + url);

  conn = allConnections[url];
  if (!conn) {
    log.info('creating new connection for ' + url);
    conn = mongoose.createConnection(url, {
      useMongoClient: true,
      autoReconnect: true,
      autoIndex: false,
      reconnectTries: Number.MAX_SAFE_INTEGER
    });    
    // Log database connection events
    conn.on('connected', () => log.info('Mongoose connection open to ' + url));
    conn.on('error', (err) =>  log.error('Mongoose connection error: ' + err));
    conn.on('disconnected', () => log.error('Mongoose connection disconnected'));  
    allConnections[url] = conn;
  }
  else {
    log.info('reusing existing connection for ' + url);
  }
  return conn;
}

์œ„์˜ ๊ฒฝ์šฐ @raythree .on('error') ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ๊ฒฝ์šฐ ์ดˆ๊ธฐ ์—ฐ๊ฒฐ์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜๋ ค๋ฉด async/await๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

let conn;
for (let i = 0; i < numRetries; ++i) {
  try {
    conn = await mongoose.createConnection(uri);
    break;
  } catch (error) {}
}

@vkarpov15 ๋‹ต๋ณ€์ด

@jorgecuesta ํ•˜์„ธ์š” mongoose.connect(uri).catch(err => {})

@vkarpov15 connect() ์—ฐ๊ฒฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ?

const connection = mongoose.connect(uri || undefined, {useMongoClient: true});
connection.once('error', (e) => {
  console.error(e, 'mongoose connection error.');
});
connection.once('connected', () => {
  console.log('mongoose connected');
});

5.0.0์—์„œ๋Š” mongoose.connect() ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. 4.x์—์„œ๋Š” ์—ฐ๊ฒฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ .then() ๋ฐ .catch() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ await ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @joeytwiddle์ž…๋‹ˆ๋‹ค.

Heroku์— ๋ฐฐํฌํ•  ๋•Œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]

2017๋…„ 7์›” 12์ผ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•/์†”๋ฃจ์…˜์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋ชฝ๊ตฌ์Šค/๋…ธ๋“œ๋ฅผ ์ฒ˜์Œ ์ ‘ํ–ˆ์Šต๋‹ˆ๋‹ค. createConnection ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ชฝ๊ตฌ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค: ^5.0.10, ๋…ธ๋“œ: v9.4.0
๊ฑด๋ฐฐ

@juancarlucci ์›ํ•˜๋Š” ํŒŒ์ผ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฝ๊ตฌ์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ด์ „ ์ฃผ์„์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

@joeytwiddle ์‚ฌ์šฉ ์˜ˆ์‹œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ฑด๋ฐฐ.

mongo์— ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

connection error: { MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connection 0 to localhost:27017 timed out]
    at Pool.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/topologies/server.js:505:11)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at Connection.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/connection/pool.js:329:12)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/connection/connection.js:256:10)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:106:13)
    at Socket.emit (events.js:208:7)
    at Socket._onTimeout (net.js:420:8)
    at ontimeout (timers.js:482:11)
    at tryOnTimeout (timers.js:317:5)
    at Timer.listOnTimeout (timers.js:277:5)
  name: 'MongoNetworkError',
  message: 'failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connection 0 to localhost:27017 timed out]' }
(node:5453) UnhandledPromiseRejectionWarning: MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connection 0 to localhost:27017 timed out]
    at Pool.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/topologies/server.js:505:11)
    at emitOne (events.js:116:13)
    at Pool.emit (events.js:211:7)
    at Connection.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/connection/pool.js:329:12)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at Socket.<anonymous> (/home/wasd_xyz/Desktop/test/node_modules/mongodb-core/lib/connection/connection.js:256:10)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:106:13)
    at Socket.emit (events.js:208:7)
    at Socket._onTimeout (net.js:420:8)
    at ontimeout (timers.js:482:11)
    at tryOnTimeout (timers.js:317:5)
    at Timer.listOnTimeout (timers.js:277:5)
(node:5453) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:5453) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.


sudo ์„œ๋น„์Šค mongodb ์ƒํƒœ

โ— mongodb.service - MongoDB Database
   Loaded: loaded (/etc/systemd/system/mongodb.service; enabled; vendor preset: 
   Active: active (running) since Sat 2018-06-23 17:13:28 IST; 13min ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 4224 (mongod)
    Tasks: 24 (limit: 4915)
   CGroup: /system.slice/mongodb.service
           โ””โ”€4224 /usr/bin/mongod --quiet --config /etc/mongod.conf

Jun 23 17:13:28 Inspiron5370 systemd[1]: Started MongoDB Database.


@pranshuchittora MongoDB ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํฌํŠธ๊ฐ€ 27017์ธ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ localhost ๋Œ€์‹  127.0.0.1์„ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  localhost ๋Œ€์‹  ip๋กœ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

 let local = "mongodb://127.0.0.1:27017/XXX";
      mongoose.connect(
        local,
        { useNewUrlParser: true }
      );

์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ ์‹œ๋„๊ฐ€ ์‹คํŒจํ•˜๋ฉด ํ•ญ์ƒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์•ฑ/์Šคํฌ๋ฆฝํŠธ ์‹œ์ž‘ ์ „์— DB๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜๋ ค๋Š” ๊ฒฝ์šฐ).

๋ชฝ๊ตฌ์Šค@5.3.16
@types/ ๋ชฝ๊ตฌ์Šค @
@types/ [email protected]

async function waitForMongoDBStart(uri: string, timeoutMs: number) {

    return new Promise( async (resolve, reject) => {

        let endTime = Date.now() + timeoutMs;


        while (true) {

            let connectionError: Error;

            function errorHandler(err: Error) {
                connectionError = err;
            }
            mongoose.connection.once("error", errorHandler);

            await mongoose.connect(uri, {
                connectTimeoutMS: 5000, // This timeout applies only after connected & connection lost
                useNewUrlParser: true,
                useFindAndModify: false
            });

            // Time for error event propagation
            await wait(0);

            if ( ! connectionError) {
                mongoose.connection.removeListener("error", errorHandler);
                return resolve(); // All OK, connected
            }

            if (connectionError.name !== "MongoNetworkError") {
                return reject(`Unable to connect mongoDB. Details: ${connectionError}`);
            }

            if (Date.now() > endTime) {
                return reject(`Unable to connect mongoBD in ${timeoutMs} ms. Details: ${connectionError}`);
            }

        }

    });
}

@vkarpov15 ์ด๊ฒƒ์€ ๋งค์šฐ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๋™์ž‘์ž…๋‹ˆ๋‹ค. https://mongoosejs.com/docs/connections.html์—์„œ :

connectTimeoutMS - How long the MongoDB driver will wait 
before failing its initial connection attempt. 
Once Mongoose has successfully connected, connectTimeoutMS is no longer relevant.

์„ค๋ช…์„œ์—๋Š” ์ดˆ๊ธฐ ์—ฐ๊ฒฐ์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋‚˜์™€ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. failed to connect to server ์˜ค๋ฅ˜๋กœ ์ฆ‰์‹œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

MongoDB ๋“œ๋ผ์ด๋ฒ„์—์„œ ์ผ๊ด€๋œ ๋™์ž‘์ด๋ผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ false reconnectOnInitialFail ์™€ ๊ฐ™์€ ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋™์ž‘์€ vkarpov15์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.
connectImeoutMS๋Š” ์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ ์ดํ›„์—๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค(์ฒซ ๋ฒˆ์งธ ์—ฐ๊ฒฐ ์‹œ
DB๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ฆ‰์‹œ
์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ)

sob., 22 gru 2018 o 13:03 Dmitry Kirilyuk [email protected]
๋‚˜ํ”ผ์‚ฌ์šฐ(a):

MongoDB ๋“œ๋ผ์ด๋ฒ„์—์„œ ์ผ๊ด€๋œ ๋™์ž‘์ด๋ผ๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
reconnectOnInitialFail๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Automattic/mongoose/issues/5169#issuecomment-449565468 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABY-TjgeI2UqVca050y5YY3zi6w7nMkfks5u7h-vgaJpZM4M-1ur
.

--
๋ณด์ด์น˜์—ํ ํ”ผ๋ฐ๋ ‰

๋ชจ๋ฐ”์ผ: +48 516 661 428

์ œ ๊ธฐ์–ต์ด ๋งž๋‹ค๋ฉด, connectTimeoutMS๋Š” ๋„คํŠธ์›Œํฌ ์ƒํƒœ์™€ OS์— ๋”ฐ๋ผ ์ดˆ๊ธฐ ์—ฐ๊ฒฐ์—์„œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์—ฐ๊ฒฐ ํ›„ connectTimeoutMS๋Š” ์–ธ์ œ ์ค‘์š”ํ•ฉ๋‹ˆ๊นŒ?

์ œ ๊ฒฝ์šฐ์—๋Š” Windows 10 ๋ฐ Alpine Linux (๋ฒ„์ „ ์•Œ ์ˆ˜ ์—†์Œ)์—์„œ localhost mongod ์ธ์Šคํ„ด์Šค๋ฅผ ์ฒ˜์Œ ์‹œ๋„ ํ•  ๋•Œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์„ ๋•Œ ์ฆ‰๊ฐ์ ์ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Mongod ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
localhost ์ด์™ธ์˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ˆ„๊ตฌ๋‚˜?

@fider @Jokero ์ œ๊ฐ€ ๋” ํŒŒ๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. connectTimeoutMS ๋Š” ์ดˆ๊ธฐ ์—ฐ๊ฒฐ์„ ํ•  ๋•Œ๊นŒ์ง€๋งŒ ์ค‘์š”ํ•˜๊ณ  socketTimeoutMS ๋Š” ๋‚˜์ค‘์— ์ด์–ด๋ฐ›์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ MongoDB ๋“œ๋ผ์ด๋ฒ„์˜ ๊ด€๋ จ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

connectTimeoutMS ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ DNS ์˜ค๋ฅ˜ ๋˜๋Š” ์—ฐ๊ฒฐ ๊ฑฐ๋ถ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์œ ์šฉํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํฌํŠธ์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” TCP ์„œ๋ฒ„๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

const net = require('net');

const server = net.createServer();

server.listen(27055);

connectTimeoutMS ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const assert = require('assert');
const mongoose = require('mongoose');
mongoose.set('debug', true);

const { Schema } = mongoose;

run().then(() => console.log('done')).catch(error => console.error(error.stack));

async function run() {
  await mongoose.connect('mongodb://localhost:27055', {
    useNewUrlParser: true,
    connectTimeoutMS: 1000,
    socketTimeoutMS: 25000
  });
} 
$ time node gh-5169.js 
MongoNetworkError: connection 0 to localhost:27055 timed out
    at Socket.<anonymous> (/mongoose/node_modules/mongodb-core/lib/connection/connection.js:259:7)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:106:13)
    at Socket.emit (events.js:208:7)
    at Socket._onTimeout (net.js:407:8)
    at ontimeout (timers.js:475:11)
    at tryOnTimeout (timers.js:310:5)
    at Timer.listOnTimeout (timers.js:270:5)

real    0m2.293s
user    0m0.271s
sys 0m0.043s
$ 

๋•Œ๋•Œ๋กœ ๋„คํŠธ์›Œํฌ ์ œํ•œ์œผ๋กœ ์ธํ•ด MongoDB URL์ด ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ/์ธํ„ฐ๋„ท ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด ๋ณด์‹ญ์‹œ์˜ค.

https://stackoverflow.com/questions/47958683/cannot-connect-to-mongodb-atlas-through-mongo-shell?answertab=active#tab -top

์ดˆ๊ธฐ ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค ๋•Œ (์ ์–ด๋„) ์„ธ ๊ฐ€์ง€ ์ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. mongodb๊ฐ€ ์žˆ๊ณ  ์—ฐ๊ฒฐ์ด ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  2. ์„œ๋ฒ„๋Š” ์ด ํฌํŠธ์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ์„ _์ ๊ทน์ ์œผ๋กœ ๊ฑฐ๋ถ€ํ•œ_ ๋ฐฉํ™”๋ฒฝ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋Š” "์—ฐ๊ฒฐ์ด ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. (๋ณดํ†ต ์ฆ‰์‹œ ๋ฐœ์ƒํ•˜๋ฉฐ ์ด๊ฒƒ์ด fider๊ฐ€ ๊ฒฝํ—˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

  3. ์„œ๋ฒ„๊ฐ€ ์ „ํ˜€ ์‘๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฉํ™”๋ฒฝ์ด ํŒจํ‚ท์„ _์ˆ˜๋™์ ์œผ๋กœ ์‚ญ์ œ_ํ–ˆ๊ฑฐ๋‚˜ ํ•ด๋‹น IP ์ฃผ์†Œ์— ์„œ๋ฒ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (์ด ๊ฒฝ์šฐ vkarpov์˜ connectTimeoutMS ๊ฐ€ ๊ฒฐ๊ตญ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.)

๋”ฐ๋ผ์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ํ•ญ์ƒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ๋‚ด์— ๋ช…ํ™•ํ•œ ์„ฑ๊ณต์ด๋‚˜ ์‹คํŒจ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋„คํŠธ์›Œํ‚น์—์„œ ๊ทธ๋ฆฌ๊ณ  ๋˜ํ•œ ๋น„ํ˜‘์กฐ์ ์ธ ์‚ฌ๋žŒ๊ณผ ์ด์•ผ๊ธฐํ•  ๋•Œ๋„ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์š”์ฒญ์€ "NO!"๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๊ฑฐ๋ถ€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  .....

ํ™•์‹คํ•œ ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @joeytwiddle :+1:

mongodb+srv ์‚ฌ์šฉํ•˜๋Š” ๋ณต์ œ ์„ธํŠธ ์—ฐ๊ฒฐ์—์„œ ์ด ๋™์ž‘์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚ด ๋ณต์ œ๋ณธ ์„ธํŠธ๊ฐ€ ๋กค๋ง ์žฌ์‹œ์ž‘ ์‹œ๋‚˜๋ฆฌ์˜ค(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—…๋ฐ์ดํŠธ)์— ์žˆ์„ ๋•Œ connect ECONNREFUSED 34.238.xxx.xxx:27017 ์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

@esetnik useUnifiedTopology: true ์™€ Mongoose 5.7.5๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ด€๋ จ๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ #8209๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

@vkarpov15 ๋„ค ๋งž์Šต๋‹ˆ๋‹ค! ํŒ ๊ณ ๋งˆ์›Œ. ํ†ตํ•ฉ ํ† ํด๋กœ์ง€๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•œ ํ›„ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”. ๋‚ด ํ”„๋กœ์ ํŠธ์— ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์–ด๋–ค ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?!

@fdmxfarhan ์€ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ๋ฌธ์ œ ํ…œํ”Œ๋ฆฟ์„ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰