์๋ก์ด ๊ธฐ๋ฅ virtual async
, ์ง์ํด์ฃผ์ธ์!
const User = new Schema(
{
username: {
type: String,
index: true,
unique: true
},
encryptedPassword: {
type: String,
required: true,
minlength: 64,
maxlength: 64
},
passwordSalt: {
type: String,
required: true,
minlength: 32,
maxlength: 32
}
})
User.virtual('password').set(async function generate(v) {
this.passwordSalt = await encryptor.salt()
this.encryptedPassword = await encryptor.hash(v, this.passwordSalt)
})
const admin = new User({
username: 'admin',
password: 'admin'
})
admin.save()
ํ์ฌ, ๋๋ ๋๋ฌ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
User.virtual('password').set(function(v) {
this.encryptedPassword = v
})
User.pre('validate', function preValidate(next) {
return this.encryptPassword().then(next)
})
User.method('encryptPassword', async function encryptPassword() {
this.passwordSalt = await encryptor.salt()
this.encryptedPassword = await encryptor.hash(
this.encryptedPassword,
this.passwordSalt
)
})
+1
+1
์ฝ๋์ ์์ฃผ ์ข์ ์์ด๋์ด๊ฐ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ๋ช ๋ฒ ๋ณด์์ง๋ง ์กฐ์ฌํ ์๊ฐ์ด ์์์ต๋๋ค. ๋๋ ์ด ์์ด๋์ด๋ฅผ ์ข์ํ์ง๋ง, ๋ค์ ์ถ์๋ฅผ ์ํด ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
๋ฌธ์ ๋ .. ์ฌ์ฉ ๊ตฌ๋ฌธ์ด ์ด๋ป๊ฒ ์๊ฒผ์ต๋๊น?
await (user.password = 'some-secure-password');
์๋ํ์ง ์์ต๋๋ค.
ECMA262 12.15.4 ์ ๋ฐ๋ฅด๋ฉด user.password = 'some-secure-password'
์ ๋ฐํ ๊ฐ์ _rval_ ์ด์ด์ผ ํ๋ฉฐ ์ด ๊ฒฝ์ฐ 'some-secure-password'
์
๋๋ค.
๋น์ ์ ๋ฐํ ๊ฐ์ ๊ฐ์ง๊ณ ์ ์ํ๋ someVar = object
๊ฐ ์ Promise
, ๊ทธ๋ฆฌ๊ณ ์ ๋ฐ๋ผ ์ด ์ค๋ ๋ , ๊ทธ๋ฆฌ๊ณ ์์ ๋งํฌ ๋ ES262 ์ฌ์, ๊ทธ๊ฒ์์ด๋ค "ES ์๋ฏธ ๊น์ ์๋ฐ."
๋ํ, ๋จ์ํ ํธ์ ๊ธฐ๋ฅ์ ๊ฐ๊ธฐ ์ํด ์ด๋ฌํ ์๋ฏธ๋ก ์ ์๋ฐ ๋ฌธ์ ๋ฅผ ๊ตฌํํ๋ ค๋ ์๋๋ ์๋นํ ๋์ ์๊ฐ์ ๋๋ค. ํนํ ๋ชฝ๊ตฌ์ค ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์ ์ ์ฌ์ ์ผ๋ก ๋ชจ๋ ์ข ๋ฅ์ ๋์ ๊ฒ์ ์๋ฏธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฅ ํ์ง ์๋ ์ด์ :
const hashPassword = require('./lib/hashPassword');
const password = await hashPassword('some-secure-password');
User.password = password; // This is completely normal.
๋ฌธ์ ๊ทธ๋๋ก ์ด๋ ๊ฒ ๊ฐ๋จํ ์ ๋ผ์ด๋๋ฅผ ์ํด ์ฒ์๋ถํฐ ํ๋ฉด ์ ๋๋ async
setter๋ฅผ ๋ง๋ค๋ ค๊ณ ํ ํ์๊ฐ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ํ ์๋ ์์ต๋๋ค.
User.methods.setPassword = async function (password) {
const hashedPassword = await hashPassword(password);
this.password = hashedPassword;
await this.save();
return this;
};
const myUser = new User();
await myUser.setPassword('mypassword...');
๊ฐ์ ์์ , ์ฌ์ ์ ์ฅ ํํฌ ๋ฑ์ ์ํํ๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค...
@heisian๋ ๋ง์์ ๋์ํฉ๋๋ค. ์ด๊ฒ์ IMHO์๊ฒ ๊ธฐ๋ฅ/API ํฝ์ฐฝ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ์ฌ๊ธฐ์ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋์์ด ์ผ๋ง๋ ๋ถํธํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ํด ๊ฝค ์ค์ํ ๊ตฌ๋ฌธ ์ง์์ ์ถ๊ฐํ๋ ๊ฒ์ ํ์คํ ๋ถํ๋ ค์ง ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋งค์ฐ ๊ฐ๋จํ ๊ธฐ๋ฅ์ด ์์ด์ผ ํฉ๋๋ค.
User.virtual('password').set((value, done) => {
encryptValueWithAsyncFunction
.then(response => done(null, value))
.catch(reason => done(reason))
;
})
@gcanu ๋น์ ์ ๋ด๊ฐ ๊ฒ์ํ ๊ฒ์ ์์ ํ ๋ฌด์ํ๊ณ ์์ผ๋ฉฐ, ๋น์ ์ด ์ ์ํ๋ ๊ฒ์ ํ ๋น ํธ์ถ์์ Promise๋ฅผ ๋ฐํํ๊ณ Javascript/ECMA262 ์ฌ์์ ์์ ํ ์๋ฐํฉ๋๋ค. ์ฝ๋ ์ค๋ํซ์ด ์๋ํ๋ ค๋ฉด setter ํจ์๊ฐ Promise์ฌ์ผ ํฉ๋๋ค. ์ด๋ ์ ์์ ๋ฐ๋ผ ์ฌ์์ ๋ฐ๋ผ ํ์ฉ๋์ง ์์ผ๋ฉฐ ์ด์จ๋ ์๋ํ์ง ์์ต๋๋ค.
๊ทธ๋ฅ ํ๋ ๊ฒ ๋ฌด์จ ์๋ชป์ด์ผ:
await User.setPassword('password');
???
์ด์ ์ ๋ณด์ง ๋ชปํ ๊ฒฝ์ฐ ์๋ํ์ง ์์ต๋๋ค .
await (User.password = 'password');
@vkarpov15 ์ด๊ฒ์ ๋ชฝ๊ตฌ์ค ๊ด๋ จ ๋ฌธ์ ๊ฐ ์๋๋ผ ํ์ฌ ECMAScript ์ฌ์์ ์ ํจ์ฑ์ ๋ํ ์ง๋ฌธ์ ๋๋ค. ์ด "๊ธฐ๋ฅ ์์ฒญ"์ ๋ซ์์ผ ํฉ๋๋ค...
์๋ ์ฝ๋๋ ๋งค์ฐ ๋์ ์๊ฐ์
๋๋ค! ๋น๋ฐ๋ฒํธ ์ค์ ์ save
์์
์ด ํฌํจ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
User.methods.setPassword = async function (password) {
const hashedPassword = await hashPassword(password);
this.password = hashedPassword;
await this.save();
return this;
};
const myUser = new User();
await myUser.setPassword('mypassword...');
๋ชฝ๊ตฌ์ค๋ ๋ ํ๋์ ์ด๊ณ ๋ ์ฐ์ํ ๊ฒ์ด ํ์ํฉ๋๋ค.
@heisian ์ข์, ๋ด ์ค์, ๋ด๊ฐ ์ธํฐ ์ฌ์ฉ์ ๋๋ณด์ง ์์์ต๋๋ค ...
@heisian Plz๋ https://github.com/Automattic/mongoose/blob/master/lib/virtualtype.js๋ฅผ ์ฐธ์กฐ
ํ์ฌ Mongoose IMPL์์ getter
๋๋ setter
ํจ์๋ฅผ ๋ฑ๋กํ ๋ค์ ํธ์ถํ๋ฉด https://tc39.github.io/ecma262/#sec -assignment-operators-runtime-semantics๊ฐ ์๋๋๋ค. -ํ๊ฐ ๋ฐ https://github.com/tc39/emascript-asyncawait/issues/82. ๊ทธ๊ฑด ๋ฌ๋ผ.
๊ทธ๋ฌ๋ ์ด ์์ฒญ์ ์ฌ์ญ์์ค.
@fundon , ์๋ ค์ฃผ์ธ์: ๊ฐ์ ์ธํฐ๋ฅผ ์ ํํ ์ด๋ป๊ฒ ๋ถ๋ฅผ๊น์? ์ฌ์ฉ๋ฒ์ ๋ณด์ฌ์ฃผ์ธ์. async
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฝ์์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์๋ ์์ ๋ setter/assignment ํธ์ถ์ ์ด๋์๋ await
ํ์ํ์ง ์์ต๋๋ค.
๋ด ์์ ์ฝ๋๋ ๋จ์ง ์์ผ ๋ฟ์ ๋๋ค... ๋น์ ์ ๋ํ ์ด๊ฒ์ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค:
User.methods.setPassword = async function (password) {
const hashedPassword = await hashPassword(password);
this.password = hashedPassword;
return this;
};
const myUser = new User();
await myUser.setPassword('mypassword...');
await myUser.save();
ํ์คํ..
๋น์ ์ ๋ชจ๋ฒ์ ๋์๊ฒ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋๋ค.
์ํด์
await new User({ password }).save()
๋ ๊ฐ๋จํ๊ณ ์ฐ์ํ ๋ชจ๋์์ ๋น๋ฐ๋ฒํธ๋ฅผ ํด์ํ์ญ์์ค.
์์? ๋ช ์ค์ ์ฝ๋๋ฅผ ์ ์ฅํ ์ ์์ต๋๊น? ๊ทธ ์ด์ ๋ ๋ชจ๋ ์ถ๊ฐ ์์ ์ ์ ๋นํํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ผ๋ฉฐ ์ฝ๋๋ฒ ์ด์ค์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๊นจ๋จ๋ฆด ์ ์์ต๋๋ค.
๋ํ ํ๋ฃจ๊ฐ ๋๋๋ฉด ์ด๋ป๊ฒ ํํํ๋ Mongoose ๋ด์์ ๋ด๋ถ์ ์ผ๋ก ์งํ๋๋ ๊ฒ์ ๋น๋๊ธฐ/๋๊ธฐ๊ฐ ๋ ์ ์๋ setter๋ผ๋ ์ฌ์ค์ ๊นจ๋ฌ์์ผ ํฉ๋๋ค.
@heisian์ ๋์ํ์ง ์์ต๋๋ค. ๋ชฝ๊ตฌ์ค๋ ์ค๋๋ ๊ฒ์ด ๋๋ฌด ๋ง์ต๋๋ค. ๋ชฝ๊ตฌ์ค๋ ๋ฆฌํฉํ ๋ง์ด ํ์ํฉ๋๋ค!
๋ชฝ๊ตฌ์ค๋ ํ๋๊ฐ ํ์ํฉ๋๋ค.
์ด ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋ ๊ฒฝ์ฐ. Mongoose๋ฅผ ํฌํฌํ๊ณ ๋ฆฌํฉํ ๋งํ๊ฒ ์ต๋๋ค! ์๋ ํ ๊ณ์ธ์!
์์ฒญ๋! ๊ทธ๊ฒ์ด ์คํ์์ค์ ํต์ฌ์ด๋ค. ๊ณ์ํด์ ํธ๋ฆฌ๋ฐ๋ ๋ฒ์ ์ผ๋ก ํฌํฌ๋ฅผ ๋ง๋์ญ์์ค. ์ฐ๋ฆฌ ๋ชจ๋์๊ฒ ์ข์ ๊ฒ์ ๋๋ค.
await (User.password = 'password');
ํ์์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ผํ ์ง์ง ๋จ์ ์ user.password = 'password';
๊ฐ ๋ฐ์ํ๋ ์ผ๋ถ ๋น๋๊ธฐ ์์
์ด ์์์ ์๋ฏธํ๋ฏ๋ก user.passwordSalt
๊ฐ ์ค์ ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ด ํํฌ์ ์ด๋ป๊ฒ ๊ด๋ จ๋๋์ง๋ ํฅ๋ฏธ๋ก์ด ์ง๋ฌธ์
๋๋ค. pre('validate')
๋๋ pre('save')
ํํฌ๊ฐ ์๋ ๊ฒฝ์ฐ user.password
๋น๋๊ธฐ ์์
์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๊น?
๋๋ ์ด ๋ฌธ์ ๋ฅผ ์์์ ๋ผ๊ณ ์ถ์ง ์์ต๋๋ค. .save()
, .find()
๋ฑ ๋ค์ ์๋ ๋น๋๊ธฐ ๋์์ ํตํฉํ๋ ๋ฐ๋ ๋ง์ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋๋จธ์ง API์ ์ ๋ง๋์ง ํ์ธํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ค๋๋ ๋น๋๊ธฐ getter์ setter๋ ๋์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ ์ ์ํธํ ๋ฐฉ๋ฒ์ผ๋ก ํ๋๋ฅผ ๋ณตํธํ/์ํธํํ๊ธฐ ์ํด getter ๋ฐ setter์์ HTTP ์์ฒญ์ ๋ณด๋ด์ผ ํ๋๋ฐ ํ์ฌ๋ก์๋ ๊ทธ๋ ๊ฒ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
@gcanu ๋๋ ๊ทธ๊ฒ๋ค์ ๋ฉ์๋ ๋ก ๊ตฌํํ ๊ฒ์ ๋๋ค.
์ธ๊ธํ ์ด์ ์ ํ์ํ ๋น๋๊ธฐ ์์
์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ ์ฌ์ค ๋๋ฌธ์ async
๋์์ ํตํฉํ๋ ๋ฐ ๋์์ด ๋๋ ์ ํธ๋ฆฌํฐ๋ ์์ต๋๋ค. ๋ค์ await (User.password = 'password')
๋ ECMAScript ๊ท์น์ ์๋ฐํ๊ณ ์ ๋ ์ฐ์ํ๊ฒ ๊ตฌํํ๋ ๊ฒ์ด ์ด๋ ต๊ณ ๊ฐ์น๊ฐ ์๋ค๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค ...
๋น์ ๋ง์ด ๋ง์, ๊ทธ ํจํด์ ์ฐ๋ฆฌ๊ฐ ๊ตฌํํ ๊ฒ์ด ์๋๋ค. ์ ์ฅํ๊ธฐ ์ ์ ๋น๋๊ธฐ ๊ฐ์์ด ํด๊ฒฐ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์์ด๋์ด๋ ํฅ๋ฏธ๋กญ์ต๋๋ค.
toJSON({virtuals: true})
๊ตฌํ์ ์ ํฉํฉ๋๋ค. ์ง๋ ฌํํ ํ์๋ง ์คํํ๊ณ ์ถ์ db์ ๋ํ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ ์ป์ ๊ฐ์ ํ๋ ์ค ์ผ๋ถ์
๋๋ค.
@gabzim JSON.stringify๊ฐ ์ฝ์์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฝค ์ง์ ๋ถํ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ res.json()์ ํํํ ์ถ๊ฐ ๋์ฐ๋ฏธ๋ฅผ ์ถ๊ฐํ์ง ์๋ ํ ๋น๋๊ธฐ ๊ฐ์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ ์, ์ดํด๊ฐ ๋ฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค @vkarpov15
get
์ฝ๋ฐฑ ๋ด์์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ ๋ฐฉ๋ฒ์ผ๊น์?
๋๋ ์ด๊ฒ์ด ์ด๋ค ๊ฒฝ์ฐ์ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
Github URL ๊ฒฝ๋ก์ ๊ฐ์ด ๋ฌธ์๊ฐ ์ค์ฒฉ๋ ์ ์๋ ์น ํ์ด์ง(๋๋ ๋ฌธ์)์ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ป๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
const Doc = require('./Doc.js');
//...
subDocSchema.virtual('fullpath').get(async function(){
const doc = await Doc.findById(this.doc); //doc is a Doc ref of type _id
return `/${ doc.path }/${ this.path }`
})
์ฟผ๋ฆฌ ์์ ์ด ๋น๋๊ธฐ์์ด๋ฏ๋ก ์ฌ๊ธฐ์ async/await๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
@JulianSoto ์ด ๊ฒฝ์ฐ ๊ฐ์์ด ์๋ ๋ฉ์๋ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ๊ฐ์ ์ ์ฌ์ฉํ๋ ์ฃผ๋ ์ด์ toJSON()
๋ฐ toObject()
๋ ๋๊ธฐ์์ด๋ฏ๋ก ๋น๋๊ธฐ ๊ฐ์์ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋ํ ์ฌ์ฉ ์ฌ๋ก๋ ๋ง๋ฌ๊ณ ์ข์ ์๋ฃจ์ ์ ์๊ฐํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ผ๋ฉฐ ์์ด๋์ด์ ๋งค์ฐ ๊ฐ๋ฐฉ์ ์ด๋ฉฐ setter ์๋ฏธ๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์๋๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
JSON ํจ์น ์ธํธ๋ฅผ ๋ชฝ๊ตฌ์ค ๋ชจ๋ธ์ ์๋์ผ๋ก ์ ์ฉํ๋ ์ ํธ๋ฆฌํฐ๋ฅผ ์์ฑํ์ต๋๋ค. ๊น์ ๊ฒฝ๋ก๋ก ์๋ ์ฑ์ฐ๊ธฐ๋ฅผ ์ง์ํฉ๋๋ค: https://github.com/claytongulick/mongoose-json-patch
์์ด๋์ด๋ https://github.com/claytongulick/json-patch-rules ์ ๊ฐ์ ๋ช ๊ฐ์ง ๊ท์น๊ณผ ํจ๊ป JSON ํจ์น๋ฅผ ์ฌ์ฉํ์ฌ '์๋' API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ๊ทผ์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ด ๊ณํ์ ๋จ์ ํ ๋น์ด ์๋ํ์ง ์๋ ๊ฒฝ์ฐ ๊ฐ์์ ์ฌ์ฉํ๋ ๊ฒ์ด์์ต๋๋ค. ํจ์น๊ฐ ์ ์ฉ๋๋ฉด ๊ฐ์์ด ์ํ๋ ๋ชจ๋ ๊ฒ์ ์ ํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ธํฐํ์ด์ค ๊ฐ์ฒด๊ฐ ์ค์ ๋ชฝ๊ตฌ์ค ๋ชจ๋ธ/db ๊ฐ์ฒด์ ๋ค๋ฅผ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, 'payment_methods'์ ๋ํ '์ถ๊ฐ' ์์ ์ ์ง์ํ๋ ์ฌ์ฉ์ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค. ์ง๋ถ ๋ฐฉ๋ฒ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐฐ์ด์ ์ง์ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋๋๋ค. ์ง๋ถ ํ ํฐ์ผ๋ก ํ๋ก์ธ์๋ฅผ ํธ์ถํ๊ณ , ์ง๋ถ ๋ฐฉ๋ฒ ํ ํฐ์ ๋ค์ ๋ฐ๊ณ , ์ด๋ฅผ ๋ชจ๋ธ์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ ์ฅํ๋ ๋ฑ...
ํ์ง๋ง ๊ฐ๋ ์ ๋ชจ๋ธ์ธ ์ธํฐํ์ด์ค ๋ชจ๋ธ์ด JSON ํจ์น '์ถ๊ฐ' ์์ ์ผ๋ก ํจ์น๋ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋น๋๊ธฐ ์ธํฐ๊ฐ ์์ผ๋ฉด ์๋ํ์ง ์์ต๋๋ค. ์ ์ผํ ์ต์ ์ ๋ ๋์ ์์ด๋์ด๊ฐ ์๋ ํ mongoose-json-patch๊ฐ ๊ฒฝ๋ก, ์์ ๋ฐ ๋ชฝ๊ตฌ์ค ๋ฉ์๋ ๊ฐ์ ์ผ์ข ์ ๋งคํ์ ์ต์ ์ผ๋ก ์๋ฝํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
@claytongulick ๋น๋๊ธฐ ์์
์ await
๋์ ๋น๋๊ธฐ ์ค์ ๊ธฐ๊ฐ ํ์ํ ๋ค์ ๋๊ธฐ์ ์ผ๋ก ์ค์ ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
@vkarpov15 ๊ธฐ๋ณธ์ ์ผ๋ก toObject()
๋ฐ toJSON()
๋๊ธฐํ ํ๊ณ toObjectSync()
๋ฐ toJSONSync()
๊ธฐ๋ฅ์ ๋์
ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? Sync
๋ณํ์ async
๊ฐ์์ ๊ฑด๋๋ฐ์ด์ผ ํฉ๋๋ค. (์ด ํจํด์ ์ด๋๊ฐ ๋ชฝ๊ตฌ์ค์์ ์ฌ์ฉ๋์๋ ๊ฒ์ผ๋ก ๊ธฐ์ตํ๋๋ฐ, ๊ฐ์ง๊ณ ์์ด๋ ์ด์ํ์ง ์์ ๊ฒ์ด๋ค.)
๋ด ์ฌ์ฉ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ธ์์ find()
๋ฅผ ์ํํ๋ ๊ฐ์์ด ์๋ ์คํค๋ง๊ฐ ์์ต๋๋ค(๋จ์ํ ID๋ฅผ ์ฑ์ฐ๋ ๊ฒ๋ณด๋ค ์กฐ๊ธ ๋ ๋ณต์กํจ). ๋ฌผ๋ก ์ ์ฅ/์ญ์ ํํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๋ชจ๋ธ์ ์ํ๋ ํญ๋ชฉ์ ๋น์ ๊ทํํ ์ ์์ง๋ง ์ ์ง ๊ด๋ฆฌ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค(์ด ํน์ ๊ฒฝ์ฐ์๋ ์ฑ๋ฅ ์ด์ ์ด ์ค์ ๋ก ํ์ํ์ง ์์ต๋๋ค). ๊ทธ๋์ ๊ฐ์์ผ๋ก ์ ๋ฅผ ์ํด ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ์์ฐ์ค๋ฝ์ต๋๋ค.
JSON.stringify()
๋ ๋น๋๊ธฐ toJSON()
์ง์ํ์ง ์์ผ๋ฏ๋ก ๋ถํํ๋ toJSONSync()
์์ด๋์ด๋ ์๋ํ์ง ์์ต๋๋ค.
find()
๊ฐ ๊ฝค ๋ณต์กํ๋ค๊ณ ๋ง์ํ์
จ์ง๋ง ๋ง์ผ์ ๋๋นํ์ฌ ๊ฐ์ ์ฑ์ฐ๊ธฐ๋ฅผ ์ดํด๋ณด๊ณ ์ถ์ ์๋ ์์ต๋๋ค. ์ฟผ๋ฆฌ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํด ๋ณผ ์๋ ์์ต๋๋ค.
๋ํ ๋น๋๊ธฐ ๊ฐ์์๋ setter ๋๋ getter @isamert ๋ง ์์ต๋๊น?
์ด ๋ฌธ์ ๊ฐ ์๋ ์ฌ๋๋ค์ ์ํ ์๋ฃจ์ :
setter๋ง ๋น๋๊ธฐ์ธ ๊ฒฝ์ฐ ํด๊ฒฐ์ฑ
์ ์ฐพ์์ต๋๋ค. ์ฝ๊ฐ ์ง์ ๋ถํ์ง๋ง ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์์ด๋์ด๋ ์ฝ๋ฐฑ ์ํ์ผ๋ก ์ฝ์ ํ์ธ์์ ์ค์ ํ ๊ฐ์ ์์ฑ์ ํฌํจํ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ setter์ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค. setter๊ฐ ์๋ฃ๋๋ฉด ์ฝ๋ฐฑ์ ํธ์ถํฉ๋๋ค. ์ด๋ ์ธ๋ถ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์ง๋ฌธ์์ ์๊ฐ์ ์ป์ ๊ธฐ๋ณธ ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด:
const User = new Schema(
{
username: {
type: String,
index: true,
unique: true
},
encryptedPassword: {
type: String,
required: true,
minlength: 64,
maxlength: 64
}
})
User.virtual('password').set(function generate(inputWithCb, virtual, doc) {
let cb = inputWithCb.cb;
let password = inputWithCb.password;
encryptor.hash(password)
.then((hash) => {
doc.set("encryptedPassword", hash);
cb && cb();
});
})
// create the document
const admin = new User({
username: 'admin'
});
// setup the promise for setting the async virtuals
const pwdProm = new Promise((resolve) => {
admin.set("password", {cb: resolve, password: "admin"});
})
//run the promise and save only when the virtual setters have finished executing
pwdProm
.then(() => {
admin.save();
});
์ด๊ฒ์ ์์น ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ผ๋ฏ๋ก ์์ ์ ์ฑ ์ํ์ ์ฌ์ฉํ์ญ์์ค.
@silto ๊ทธ๋ฅ ์ฝ์์ ๋ฐํํ๋ ์คํค๋ง ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@vkarpov15 ๋ณดํต ๊ทธ๋ ๊ฒ ํ๊ฒ ์ง๋ง, ๋ด๊ฐ ํ ํ๋ก์ ํธ์์๋ json "๊ณํ"์์ ์๋์ผ๋ก ์์ฑ๋ ์คํค๋ง, ๊ฐ์ ๋ฐ graphQL ๋์ ์ด ์์ผ๋ฏ๋ก ํน์ ๊ฒฝ์ฐ์ ๋ํ ๋ฐฉ๋ฒ ๋์ ๊ท ์ผํ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
@silto ์ฝ๋ ์ํ์ ์ ๊ณตํ ์ ์์ต๋๊น? ๋๋ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ณด๊ณ ์ถ๋ค
setter์ ๊ฒฝ์ฐ ์ ์ฅ์ ํ๊ฑฐ๋ ๊ทธ๋ฅ ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๋ณด๊ณ ์ ์ฅํ๋ฉด ํ๋ผ๋ฏธ์ค์ด๋ฏ๋ก ํ๋ผ๋ฏธ์ค์ธ ํ๋๋ฅผ ํ์ธํ๊ณ ํด๊ฒฐํ ํ ์ ์ฅํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ ์ถ๋ค๋ฉด ์คํค๋ง ์ต์ ์ผ๋ก ์ด Model์ด Promise ์ ํ์ด ๋๋๋ก ์ ์ํ๊ฑฐ๋ ๋ชจ๋ธ์ ์์ฑํ ๋ ์คํค๋ง๋ฅผ ํ์ธํ๊ณ Promise์ธ setter, getter ๋๋ virtual์ด ์๋์ง ํ์ธํ ๋ค์ ๊ทธ๊ฒ์ ์ฝ์์ผ๋ก.
๋๋ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋(execPopulate) ํจ์์ ๊ฐ์ exec๋ฅผ ๊ฐ๋จํ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ ฅ์์์ setter, getter ๋๋ virtual์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ด์ฐฐํ๋ ค๋ ๊ฒฝ์ฐ ํด๋น ๋ฌธ์ ์ ๋ํ ํจ์๋ฅผ ๋น๋ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ค๋ฉด ์ด๋ฏธ ์ฝ์์ด๋ฏ๋ก ๋์ผํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ ์ ์์ต๋๋ค. ์ ์ฅํ๊ธฐ ์ ์.
๋๋ ์ฝ์๊ณผ ํจ๊ป ๊ฐ์์ ์ฌ์ฉํ์ง๋ง ๋ช
์์ ์ฝ์์ ์ฌ์ฉํ ๋ ๊ฑฐ์ ํญ์ ์ฝ์์ ์ ๊ฒฝ ์ฐ์ง ์์ง๋ง ์ด๋ค ๊ฒฝ์ฐ์๋ Doc์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ ์ชฝ์ด๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฏธ ํ์ธํ๊ณ ์ฝ์๋ setter๋ฅผ ์ ์ํ ํ ๋ชจ๋ ์ฝ์๋ ๊ฐ์ ๋ฐ ๊ฒํฐ์์ "then"์ ์ฌ์ฉํ ํ์๊ฐ ์๋ ์ผ์ข ์ ๋ํผ๊ฐ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ๋์๋๋ฆด ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์น์ ํ๋.
์ถ์ : Promisifed virtuals ์ฌ์ฉ์ ์ผ๋ฐ์ ์ธ ์, ์ ๊ฒฝ์ฐ์๋ 2๊ฐ์ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ๋ด ๋ฌธ์๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ธ๋ถ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์ ๋ฐ์ดํธํ ์ ์๋์ง ํ์ธํฉ๋๋ค. . ์์ ๋งํ๋ฏ์ด ๋ช ์์ ์ฝ์์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ฃผ์ง๋ง ์ด๋ฌํ ์์ ์ ์ํํ ์ ์๋์ง ๋ด๋ถ์ ์ผ๋ก ํ์ธํ๋ ค๋ฉด ๋จผ์ ์ด ์ฝ์์ ํด๊ฒฐํด์ผ ํ์ต๋๋ค.
@chumager ๋ช ๊ฐ์ง ์ฝ๋ ์ํ์ ์ ๊ณตํ ์ ์์ต๋๊น?
์๋ ํ์ธ์, ์๋ฅผ ๋ค์ด, ์๋ ๋ด ์๊ฒฌ์ ๋ฐ๋ฅด๋ฉด 2๊ฐ์ ๊ฐ์ _update ๋ฐ _delete์ ์คํค๋ง์ ์ ์๋์ด ์์ง ์์ ๊ฒฝ์ฐ ํด๋น ๊ฐ์์ ์ ์ํ๋ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ true๋ฅผ ๋ฐํํฉ๋๋ค.
ํฌ๋ ๋ง์ ์ ์ํ๋ ์๋ฎฌ๋ ์ด์
๋ชจ๋ธ๊ณผ mkt ๋ฐ์ดํฐ๋ก ์๋ฎฌ๋ ์ด์
์ ๊ฒ์ํ๋ ํ๋ก์ ํธ ๋ชจ๋๊ฐ ์์ต๋๋ค.
์๋ฎฌ๋ ์ด์
๊ณผ ์ฐ๊ฒฐ๋ ํ๋ก์ ํธ๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ฎฌ๋ ์ด์
์ ์ญ์ ํ ์ ์์ผ๋ฉฐ ํ๋ก์ ํธ๊ฐ ํฌ์์ฉ์ผ๋ก ๊ฒ์๋ ๊ฒฝ์ฐ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
์๋ฎฌ๋ ์ด์ ์์ ๊ฐ์ _update์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ฎฌ๋ ์ด์ ์ด ์ฐธ์กฐ๋๊ณ ์ํ๊ฐ "En Financiamiento"์ธ ํ๋ก์ ํธ๋ฅผ ์ฐพ๋ ๊ฒ์ ๋๋ค. ์ด ์ฟผ๋ฆฌ๊ฐ ์ฐธ์ด๋ฉด ์๋ฎฌ๋ ์ด์ ์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค... ๋ถ๋ช ํ "์ฐพ๊ธฐ"๋ ์ฝ์, ๊ทธ๋์ ๊ฐ์๋ ...
์ผ๋ฐ์ ์ผ๋ก ํ๋ก ํธ์๋์์ ์ด ๊ฐ์์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋ฐ์ดํฐ๋ ๊ฐ์ฒด๋ฅผ ํด๊ฒฐํ๋ ๋ชจ๋์ ์ํด ๊ตฌ๋ฌธ ๋ถ์๋ฉ๋๋ค(co ๋๋ express-promise์ ๋ฐ๋ผ ํ๋ ๋๋ ๊ฒฐ๊ณผ ๋ฐฐ์ด).
๋ฌธ์๋ฅผ ๋ณด๊ณ ์ถ์ ๊ฒฝ์ฐ ๋ด ๊ฐ์์ด ์ฝ์์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ด๋ฏ๋ก co ๋ชจ๋์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํด์ผ ํ์ง๋ง ์ด๋ฏธ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์์ผ๋ก ์ฌ์ฉํด์ผ ํ์ต๋๋ค... ์๋ง๋ ๊ฒฐ๊ณผ์ co๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ง๋ฒ์ ์ํํ๊ฑฐ๋ ์ฐพ๊ธฐ ํ์ co๋ฅผ ์ฌ์ฉํ๋ ํ๋ฌ๊ทธ์ธ์ผ๋ก ... ํ์ง๋ง ๊ฒฐ๊ณผ ์ธํธ๊ฐ ์ด๋ฏธ ์์ ์ ์๋ฃํ ๊ฒ์ฒ๋ผ ๋ ์์ฐ์ค๋ฝ๊ฒ ๋ณด์ ๋๋ค.
๋๋ ๋ชฝ๊ตฌ์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ง์ ๋์ ์ ์ฌ์ฉํฉ๋๋ค. si ๋๋ ๊ทธ ๊ธฐ๋ฅ์ ์ด๋์์๋ ์ฌ์ฉํ๊ฑฐ๋ ์ฐพ๊ธฐ๋ฅผ ์ํด ํฌ์คํธ ํํฌ๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒ์ ๋๋ค.
getter์ ๋ง์ฐฌ๊ฐ์ง๋ก ํํฌ๋ ์ฌ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํด์ผ ํ์ง๋ง ๋ฌธ์์ ์ํ ์ฐธ์กฐ ๋ฐ ์์ฑ์์ ๊ฐ์ ๊ธฐํ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ ๋ค๋ฅธ ์ํ์ ๊ฑด๋๋ฆฌ์ง ์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ฌธ์ ์ธ์ฌ...
์ถ์ : ์์ codo๊ฐ ์ ๋ง๋ก ํ์ํ๋ฉด ์ ์๊ฒ ์๋ ค์ฃผ์ญ์์ค.
@chumager ์ฐ๋ฌธ์ ํฐ ๋ฒฝ !== ์ฝ๋ ์ํ. ์ฝ๋ ์ํ์ ์ ๋ง ์ ํธํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฝ๋์ ์์ฃผ ์ข์ ์์ด๋์ด๊ฐ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ๋ช ๋ฒ ๋ณด์์ง๋ง ์กฐ์ฌํ ์๊ฐ์ด ์์์ต๋๋ค. ๋๋ ์ด ์์ด๋์ด๋ฅผ ์ข์ํ์ง๋ง, ๋ค์ ์ถ์๋ฅผ ์ํด ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.