본문으로 건너뛰기

Study

axios 사용법 예시

const axios = require('axios');

const API_KEY = '';

async function getCoordsForAddress(address) {
const response = await axios.get(
`https://maps.googleapis.com/maps/api/geocode/json?address=${encodeURIComponent(
address
)}&key=${API_KEY}`
);

const data = response.data;

if (!data || data.status === 'ZERO_RESULTS') {
const error = new HttpError('Could not find location for the specified address.', 422);
throw error;
}

const coordinates = data.results[0].geometry.location;

return coordinates;
}

module.exports = getCoordsForAddress;

이렇게 해서 위도와 경도값을 가지고 올 수 있다.

model 설정

const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');

const userSchema = new mongoose.Schema({
이름: { type: 타입, required: 필수인지, unique, minlength, ref },
});

userschema.plugin(uniqueValidator);

module.exports = mongoose.model('문서이름', userSchema);

ref는 문서끼리의 참조를 돕는다.

populate

populate을 통해 다른 컬렉션의 문서를 가져올 수 있다.

const userSchema = new mongoose.Schema({
place: { type: mongoose.Types.ObjectId, required: true, ref: 'Place' },
});

module.exports = mongoose.model('User', userSchema);

다음과 같이 모델을 정의하고,

const user = User.findById(...).populate('place');

같이 정의한다면, place에는 id가 오는게 아니라, 'places'컬렉션에 있는 정의되어있는 id를 가진 문서를 value로 갖게된다.
그냥 id에만 접근하면 되는지, id에 해당하는 문서에 접근해야하는지 상황을 봐가며 사용한다.

섹션, 트랜잭션

문서를 생성하면, 문서 하나만 생성하는게 아니라 두 개의 문서를 생성해야 할 수 있다.
이중 둘다 db에 저장을 하거나 둘다 저장을 하지 못하면 상관없지만, 둘 중 하나만 성공하면 성공한 것은 실패한 것으로 되돌려줘야한다.
트랜잭션, 섹션을 통해 이를 해결한다.

try {
const sess = await mongoose.startSession();
sess.startTransaction();
await createdPlace.save({ session: sess });
user.places.push(createdPlace);
await user.save({ session: sess });
await sess.commitTransaction();
} catch (err) {
const error = new HttpError('Creating place failed, please try again.', 500);
return next(error);
}

섹션을 시작하고, 트렌잭션을 시작. 정상적으로 동작했다면 커밋한다.