๊ธฐ๋ณธ์ ์ผ๋ก mongoose๋ ์ฒซ ๋ฒ์งธ ์ฐ๊ฒฐ์ด ์คํจํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ๋ ธ๋๊ฐ ์ถฉ๋ํฉ๋๋ค.
๋ฐ๋ผ์ ์ด ๋ฒ๊ทธ๋ฅผ ์ฌํํ๋ ค๋ฉด ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฑ์ ๋ค์ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค.
db.on('error', console.error.bind(console, 'connection error:'));
์ด์ ๋ค์๊ณผ ๊ฐ์ด ์ด ๋ฒ๊ทธ๋ฅผ ์ฌํํ ์ ์์ต๋๋ค.
[MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]]
์์๋๋ ๋์: autoreconnect
๊ธฐ๋ณธ๊ฐ์ true์ด๋ฏ๋ก MongoDB์ ๋ค์ ์ก์ธ์คํ ์ ์๋ ์ฆ์ mongoose๊ฐ ์ฐ๊ฒฐ์ ์ค์ ํ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
์ฐธ๊ณ : ์ฒซ ๋ฒ์งธ ์ฐ๊ฒฐ์ ์ฑ๊ณตํ์ง๋ง ๋ฐํ์ ์ค์ MongoDB์ ๋ํ ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์์๋๋ก ์๋ ์ฌ์ฐ๊ฒฐ์ด ์ ๋๋ก ์๋ํฉ๋๋ค. ๋ฌธ์ ๋ ์ฑ์ด ์์๋ ๋ MongoDB๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๋ถ์ผ์น์ ๋๋ค.
(์ด๊ฒ์ด ์ํ๋ ๋์์ด๊ณ ๊ฐ๋ฐ์๊ฐ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ง ์๊ณ ๋ ธ๋ ์ถฉ๋์ ํ์ฉํ์ฌ ์ด ์ํฉ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ ๊ฒฝ์ฐ, ๋๋ ๊ทธ๊ฒ์ ๋ฐ์๋ค์ผ ์ ์์ง๋ง ๋ถ๋ช ํ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.)
๋ ธ๋ v4.4.1, [email protected] , [email protected] , [email protected]
ํ์ธํ ์ ์์ต๋๋ค.
๋
ธ๋ 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๋ฅผ ์ดํด๋ณด์๋ค. ์ด๊ฒ์ ๋๋ผ์ด๋ฒ ์
๋๋ผ์ด๋ฒ๋ ํธ์คํธ์ ์ฐ๊ฒฐํ ์ ์๋ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์ฐ๊ฒฐ์์ ์คํจํฉ๋๋ค. ์ด๊ฒ์ ์ฐ๊ฒฐํ ์ ์๋ ํธ์คํธ์์ ๋น ๋ฅธ ์คํจ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์ค๊ณ๋ ๊ฒ์ ๋๋ค. ์ฌ์ฐ๊ฒฐ ๋์์ ๋๋ผ์ด๋ฒ๊ฐ ์ด๊ธฐ ์ฐ๊ฒฐ์ ์ํํ ํ์๋ง ์์๋ฉ๋๋ค.
๋ฌด์์ ํ ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌ๋ ค ์์ต๋๋ค. ์ด๊ฒ์ ๋๋ผ์ด๋ฒ๊ฐ ๋น ๋ฅด๊ฒ ์คํจํ๊ณ ์ค์ ๋ก ์๋ํ๊ณ ์๋ค๊ณ ์๊ฐํ์ง ์๋๋ก ์๋์ ์ผ๋ก ์ค๊ณ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋์ ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด์ ์์ ๋ค๋ฅธ ํ๋์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฌ์ค ๊ทธ๋ฐ ํ๋์ ์์ค์ด ๋ฎ์ ์ด์ ์์๊ฒ ํฉ๋นํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ค์๋ก ์๋ชป๋ ํธ์คํธ๋ ์๋ชป๋ ํฌํธ์ ์ฐ๊ฒฐ์ ์๋ํ๋ ๊ฐ๋ฐ์์๊ฒ ๋์์ด ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ชฝ๊ตฌ์ค์์ ์ข ๋ ๊ฐ๋ฐ์ ์นํ์ ์ธ ์์ ์ ์ํํ๋ ค๋ฉด ๋ค์์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
error
๊ฒฝ๊ณ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ด์ผ ํ์ง๋ง ์ฌ์ ํ ์๋์ผ๋ก ์ฌ์ ์์ ์๋ํด์ผ ํฉ๋๋ค.)์ ๊ธฐ์ต์ด ๋ง๋ค๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ๋ช ๋ฒ์ ์คํจ ํ ๋ง์นจ๋ด ์ฐ๊ฒฐํ์ ๋ ์ฑ์์ ์ด๋ฏธ ํ์ ๋๊ธฐ ์ค์ธ ์ฟผ๋ฆฌ๊ฐ ์ํ๋ ๋๋ก ์คํ๋์์ต๋๋ค. (๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ค์ ํ ์คํธํ ๊ฐ์น๊ฐ ์์ต๋๋ค.)
๋๋ ์ด๊ฒ์ด ์ค์ ๋ก ๊ด์ฐฎ์ ์์ด๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ด๊ฒ์ ๊ธฐ๋ฅ ์์ฒญ์ด๋ผ๊ณ ๋ผ๋ฒจ์ ๋ถ์ผ ๊ฒ์ ๋๋ค.
์๋์, ์ด๊ธฐ ์ฐ๊ฒฐ์์ ๋น ๋ฅด๊ฒ ์คํจํ๋ ๊ฒ์ MongoDB ๋๋ผ์ด๋ฒ ์ ์ฒด์์ ๋งค์ฐ ์ผ๊ด๋ ๋์์ด๋ฉฐ mongoose๊ฐ ์ด๋ฅผ ์ง์ํ๋ ๋ฐ์๋ ํฐ ์ด์ ์ด ์์ต๋๋ค.
Strongloop Loopback mongodb ์ปค๋ฅํฐ์ ์ด ์ต๊ทผ ๊ฒ์๋ฌผ ์ ๊ด๋ จ์ด ์์ ์ ์์ต๋๋ค. lazyConnect
ํ๋๊ทธ๋ ๋์ ์ ๋๋ฌํ ๋๊น์ง ์ฒซ ๋ฒ์งธ ์ฐ๊ฒฐ์ ์ฐ๊ธฐํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์ฐ๊ฒฐ์ด ์คํจํ๋ฉด ๊ธฐ๋ณธ ์ฐ๊ฒฐ ๋๊น ์ค์ ์ด ์ ์ฉ๋ฉ๋๋ค(์ฌ์๋).
๋ด ๊ด์ฌ์ "์ปจํ ์ด๋ ์์ ์์"๋ฅผ ์ค์ ํ๊ณ ์์ํ ์ ์์ง๋ง "์๋น์ค ๊ฐ์ฉ์ฑ ์์"๋ ์ค์ ํ ์ ์๋ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ์ ๋๋ค. ์ค์ผ์คํธ๋ ์ด์ ๋๊ตฌ๋ mongo ์๋น์ค๋ฅผ ์์ง ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ์๋ mongo ์ปจํ ์ด๋๊ฐ "์๋"๋์์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ด mongo ์ปจํ ์ด๋๊ฐ ์์ํ๋ ๋ฐ 1์ด๊ฐ ๊ฑธ๋ฆฌ์ง๋ง ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ๋ฐ 5์ด๊ฐ ๊ฑธ๋ฆฌ๊ณ ๋ด ์ฑ ์ปจํ ์ด๋๊ฐ ์์ํ๋ ๋ฐ 1์ด๊ฐ ๊ฑธ๋ฆฌ๊ณ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ๋ฐ 1์ด๊ฐ ๊ฑธ๋ฆฌ๋ฉด ์ฑ ์๋น์ค๊ฐ mongo ์๋น์ค๋ฅผ ๋ฅ๊ฐํ์ฌ ์ฒซ ๋ฒ์งธ ์ฐ๊ฒฐ ์คํจ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ ์ค๋ช ๋ ๋๋ก .
Docker Compose ์ค๋ช ์ ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ ์์ต๋๋ค.
Compose๋ ์ปจํ ์ด๋๊ฐ "์ค๋น"๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ (ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์๋ฏธ๊ฐ ๋ฌด์์ด๋ ๊ฐ์) ์คํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๊ทธ๋ด๋งํ ์ด์ ๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ค๋น๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋ฌธ์ ๋ ์ค์ ๋ก ๋ถ์ฐ ์์คํ ์ ํจ์ฌ ๋ ํฐ ๋ฌธ์ ์ ์ผ๋ถ์ผ ๋ฟ์ ๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์๋ ์ธ์ ๋ ์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๊ฑฐ๋ ํธ์คํธ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฌํ ์ ํ์ ์คํจ์ ํ๋ ฅ์ ์ด์ด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํจ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฐ๊ฒฐ ์ฌ์ค์ ์ ์๋ํด์ผ ํฉ๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ฐ๊ฒฐ์ ๋ค์ ์๋ํ๋ฉด ๊ฒฐ๊ตญ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ ์ ์์ด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ ์ ์์ ์์ ์ด๋ค ์ด์ ๋ก ์ฐ๊ฒฐ์ด ๋๊ธธ ๋๋ง๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ์ด ๊ฒ์ฌ๋ฅผ ์ํ
๋ฐ๋ผ์ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ๊ณผ ๊ด๋ จํ์ฌ ์ฌ๊ธฐ์๋ ๋ถ๋ช ํ ์ฐจ์ด๊ฐ ์์ง๋ง ๋ค์ ๋ ์ ์ฅ ๋ชจ๋ ์ ํจํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
๋ฌผ๋ก ๊ฐ๊ฒฉ์ด ์์ง๋ง ์ด๊ธฐ ์ฐ๊ฒฐ์ด ์คํจํ ๊ฒฝ์ฐ ์ฌ์๋ํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ์ฑ ์์ ์ฌ์ฉ์์๊ฒ ์์ต๋๋ค. ๋ชจ๋ ๋ชฝ๊ตฌ์ค๋ ๊ทธ๊ฒ์ด ์คํจํ๋ค๊ณ ๋งํฉ๋๋ค. ํ๋ก๋์ (๋๋ ์ด์ ๊ด๋ จ๋ ๋ชจ๋ ์ปจํ ์คํธ)์์ 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์ด ์ฐจ๋จ๋ฉ๋๋ค. ๋คํธ์ํฌ/์ธํฐ๋ท ์์ค๋ฅผ ๋ณ๊ฒฝํด ๋ณด์ญ์์ค.
์ด๊ธฐ ์ฐ๊ฒฐ์ ๋ง๋ค ๋ (์ ์ด๋) ์ธ ๊ฐ์ง ์ผ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
mongodb๊ฐ ์๊ณ ์ฐ๊ฒฐ์ด ์ฑ๊ณตํฉ๋๋ค.
์๋ฒ๋ ์ด ํฌํธ์์ ์์ ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์๊ฑฐ๋ ์ฐ๊ฒฐ์ _์ ๊ทน์ ์ผ๋ก ๊ฑฐ๋ถํ_ ๋ฐฉํ๋ฒฝ์ด ์์์ ์๋ฏธํ๋ "์ฐ๊ฒฐ์ด ๊ฑฐ๋ถ๋์์ต๋๋ค"๋ผ๊ณ ์๋ตํฉ๋๋ค. (๋ณดํต ์ฆ์ ๋ฐ์ํ๋ฉฐ ์ด๊ฒ์ด fider๊ฐ ๊ฒฝํํ ๊ฒ์ ๋๋ค.)
์๋ฒ๊ฐ ์ ํ ์๋ตํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐฉํ๋ฒฝ์ด ํจํท์ _์๋์ ์ผ๋ก ์ญ์ _ํ๊ฑฐ๋ ํด๋น 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 ์ ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ด๊ณ ๋ฌธ์ ํ ํ๋ฆฟ์ ๋ฐ๋ฅด์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฒ์ ์ฐ๊ฒฐ์ด ์คํจํ ๋ ์๋ ์ฌ์ฐ๊ฒฐ์ ์ํ๋ ์ฌ๋์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํฉ๋๋ค.
๋ชฝ๊ตฌ์ค < 4.11์ ๊ฒฝ์ฐ
db.open()
๋์db.openUri()
mongoose 4.11.7์ ๊ฒฝ์ฐ ์ด ๊ธฐ์ ์ด ์๋ํ์ง ์์ต๋๋ค.
๋ชฝ๊ตฌ์ค 4.13.4์ ๊ฒฝ์ฐ ๋ค์ ์๋ํฉ๋๋ค!
ํธ์ง 2019/09/02:
promiseRetry
here ๋ฅผ ์ฌ์ฉํ๋ ๋ ์งง์ ์๋ฃจ์ ๋