게시글
질문&답변
2024.07.08
트랜잭션 기능을 서비스 함수로 구현하는 방법
가르쳐 주신 구문으로 변경을 하니 동작이 잘 됩니다 감사합니다연결해주신 유투브 내용도 잘 보았는데 그래도 targets.forEach((good) => auctionedOff(good)());이 부분에서 마지막에 빈 괄호를 붙이는 의미를 해석하기 어려워 마지막으로 한 번 더 질문 드립니다연결 해주신 유투브 내용을 바탕으로 "auctionedOff(good) 뒤에 있는 빈괄호는 auctionedOff(good)의 리턴값인 { }로 감싸진 부분을 불러오기 위함이고 이 부분은 변경 전 ForEach함수 괄호 내의 화살표 이후 {} 블럭과 동일하므로 대체할 수 있다" 로 해석 하면 될지 질문 드립니다
- 0
- 5
- 170
질문&답변
2024.07.08
트랜잭션 기능을 서비스 함수로 구현하는 방법
말씀하신데로 auctionedOff 함수를 다음과 같이 바꾸어 실행하니 잘 돌아갑니다.수정한 함수 :const sequelize = require('sequelize'); const { Auction , Good, User}= require('../models'); exports.auctionedOff = ( good ) => async () => { const t = await sequelize.transaction(); try { const success = await Auction.findOne({ where: { GoodId: good.id }, order: [['bid', 'DESC']], transaction : t, }); if (!success) { return; } await good.setSold(success.UserId); //낙찰 await User.update({ money: sequelize.literal(`money - ${success.bid}`), }, { where: { id: success.UserId }, transaction: t, }); await t.commit(); } catch (error) { await t.rollback(); } };그런데 위의 형태를 checkAuction.js 부분에 24시간이 지난 아이템에 대해 낙찰자를 지정하는 ForEach 함수 부분에도 적용해 보려고 했는데 여기는 안되는데 이유가 뭘까요?시도한 코드 : module.exports = async () => { console.log('checkAuction'); try { const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); // 어제 시간 const targets = await Good.findAll({ // 24시간이 지난 낙찰자 없는 경매들 where: { SoldId: null, createdAt: { [Op.lte]: yesterday }, }, }); targets.forEach(auctionedOff(good));아래와 같이 auctionedOff 로 바꾸기 전에 확인차 수정 했을 때는 정상적으로 낙찰된 물건에 대해 낙찰자를 지정하고 낙찰자의 금액도 빼는 프로세스가 잘되었습니다module.exports = async () => { console.log('checkAuction'); try { const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); // 어제 시간 const targets = await Good.findAll({ // 24시간이 지난 낙찰자 없는 경매들 where: { SoldId: null, createdAt: { [Op.lte]: yesterday }, }, }); targets.forEach( async (good) => { const t = await sequelize.transaction(); try { const success = await Auction.findOne({ where: { GoodId: good.id }, order: [['bid', 'DESC']], transaction : t, }); if (!success) { return; } console.log('***checkauction',success.UserId); await good.setSold(success.UserId); await User.update({ money: sequelize.literal(`money - ${success.bid}`), }, { where: { id: success.UserId }, transacion: t, }); await t.commit(); } catch (error) { await t.rollback(); } });
- 0
- 5
- 170
질문&답변
2024.07.05
트랜잭션 기능을 서비스 함수로 구현하는 방법
감사합니다 앞서 발생한 메시지는 해결 되었는데 가르쳐주신데로 수정한 이후에 다음과 같은 오류 메시지가 또 뜹니다(사진)참고 하시라 로그 에러 메시지도 첨부 합니다눈에 띠는 것은 "RangeError" 라고 뜹니다만앞서는 "TypeError" 였는데 반해서.. GET /main.css 304 0.333 ms - - Executing (default): SELECT `id`, `email`, `nick`, `password`, `money`, `createdAt`, `updatedAt`, `deletedAt` FROM `users` AS `User` WHERE (`User`.`deletedAt` IS NULL AND `User`.`id` = 1); Executing (default): INSERT INTO `goods` (`id`,`name`,`img`,`price`,`createdAt`,`updatedAt`,`OwnerId`) VALUES (DEFAULT,?,?,?,?,?,?); RangeError: The job method must be a function. at Object.scheduleJob (/Users/skychome/Desktop/My_Work/node_work/node_practice/node_auction/node_modules/node-schedule/lib/schedule.js:34:11) at exports.createGood (/Users/skychome/Desktop/My_Work/node_work/node_practice/node_auction/controllers/index.js:48:26) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) Executing (dd5254a0-4b7a-4cbd-bdd2-5b2f494da1e1): START TRANSACTION; POST /good 500 116.267 ms - 1684 Executing (dd5254a0-4b7a-4cbd-bdd2-5b2f494da1e1): SELECT `id`, `bid`, `msg`, `createdAt`, `updatedAt`, `deletedAt`, `UserId`, `GoodId` FROM `auctions` AS `Auction` WHERE (`Auction`.`deletedAt` IS NULL AND `Auction`.`GoodId` = 13) ORDER BY `Auction`.`bid` DESC LIMIT 1; GET /main.css 304 0.313 ms - -
- 0
- 5
- 170
질문&답변
2024.07.04
경매 진행 메인 화면에서 오류 발생
강사님, 결국엔 good.js 파일에 associate 함수가 associte 로 오자가 있었네요 수정하니 잘 됩니다^^
- 0
- 3
- 147
질문&답변
2024.07.03
경매 진행 메인 화면에서 오류 발생
강사님,말씀 하신 데로 workbench에 이상하게 goods table에 SoldID 칼럼이 생성 되어 있지 않습니다. auctions table에는 GoodId, UserId 칼럼이 생성되어 있는데요..(사진)참고로 models/index.js 파일 코드를 올립니다const Sequelize = require('sequelize'); const fs = require('fs'); const path = require('path'); const env = process.env.NODE_ENV || 'development'; const config = require('../config/config')[env]; const db = {}; const sequelize = new Sequelize( config.database, config.username, config.password, config, ); db.sequelize = sequelize; //db.Sequelize = Sequelize; const basename = path.basename(__filename); //현재 작업하는 file 이름 찾을려고 fs .readdirSync(__dirname) .filter( file => { // linux 에서는 앞에 . 가 붙으면 숨김파일임 return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js'; }) .forEach( (file) => { const model = require(path.join(__dirname, file)); console.log(file, model.name); db[model.name] = model; model.initiate(sequelize); //model.associate(sequelize); { //console.log(db, modelName); if (db[modelName].associate) { db[modelName].associate(db); } }); module.exports = db;
- 0
- 3
- 147