29,700원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
'S3' 형식에 'S3Client' 형식의 destroy, middlewareStack, send 속성이 없습니다.ts(2739)
안녕하세요 선생님user, post 라우터 편을 보면서 코드를 작성하던중 에러가 발생해서 문의드립니다. AWS S3 업로드 관련 부분인데 AWS.config.update({ region: 'ap-northeast-2', accessKeyId: process.env.S3_ACCESS_KEY_ID, secretAccessKey: process.env.S3_SECRET_ACCESS_KEY, }); const upload = multer({ storage: multerS3({ s3: new AWS.S3(), // s3 이부분에서 에러가 발생합니다 bucket: 'react-nodebird', key(req, file, cb) { cb(null, `original/${+new Date()}${path.basename(file.originalname)}`); }, }), limits: { fileSize: 20 * 1024 * 1024 }, }); 'S3' 형식에 'S3Client' 형식의 destroy, middlewareStack, send 속성이 없습니다.ts(2739) (property) Options.s3: S3Client 빠른 수정을 사용할 수 없음 위와 같은 에러가 발생했습니다. 그래서 구글링을 통해 에러를 수정한 코드가 아래와 같은데 이 부분이 올바르게 작성된건지 확인부탁드리고자 질문남깁니다. const upload = multer({ storage: multerS3({ s3: new S3Client({ credentials: { accessKeyId: process.env.S3_ACCESS_KEY as string, secretAccessKey: process.env.S3_SECRET_KEY as string, }, region: 'ap-northeast-2', }), bucket: 'react-nodebird', key(req, file, cb) { cb(null, `original/${+new Date()}${path.basename(file.originalname)}`); }, }), limits: { fileSize: 20 * 1024 * 1024 }, });
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
throw new Error(`${this.name}.hasMany called with something that's not a subclass of Sequelize.Model`); 에러 질문
테이블 생성 마이그레이션 db에 생성 완료 확인하였습니다.(유저 - 주소, 1대 다 관계db.User.hasMany(db.Address)db.Address.belongsto(db.User))하였으나이후 서버를 실행하니 다음과 같은 에러가 발생합니다.throw new Error(`${this.name}.hasMany called with something that's not a subclass of Sequelize.Model`);^Error: User.hasMany called with something that's not a subclass of Sequelize.Modelat Function.hasMany (E:\gmleh\workspace\react-shoppingmall\back\node_modules\sequelize\lib\associations\mixin.js:18:13)at associate (E:\gmleh\workspace\react-shoppingmall\back\models\user.ts:59:17)at Object.<anonymous> (E:\gmleh\workspace\react-shoppingmall\back\models\index.js:41:22)at Module._compile (node:internal/modules/cjs/loader:1126:14)at Object.Module._extensions..js (node:internal/modules/cjs/loader:1180:10)at Module.load (node:internal/modules/cjs/loader:1004:32)at Function.Module._load (node:internal/modules/cjs/loader:839:12)at Module.require (node:internal/modules/cjs/loader:1028:19)at require (node:internal/modules/cjs/helpers:102:18)at Object.<anonymous> (E:\gmleh\workspace\react-shoppingmall\back\app.ts:2:1) addresses 테이블 마이그레이션 -유저모델-주소 모델 - 테이블 생성 확인 -
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
안녕하세요.. connect ECONNREFUSED 127.0.0.1:3306 관련해서 질문드립니다
const dotenv = require("dotenv"); dotenv.config(); module.exports = { development: { username: "root", password: process.env.DB_PASSWORD, database: "react-nodebird", host: "127.0.0.1", dialect: "mysql", }, test: { username: "root", password: process.env.DB_PASSWORD, database: "react-nodebird", host: "127.0.0.1", dialect: "mysql", }, production: { username: "root", password: process.env.DB_PASSWORD, database: "react-nodebird", host: "127.0.0.1", dialect: "mysql", }, };(위에는 config.js 파일입니다.) 시퀄라이즈 강의에서 npx sequelize db:create 로 db 생성시 아래와 같은 메세지가 뜹니다. 기본mysql portrk 3306으로 되는거라고 알고 있고.. 혹시나해서3056 포트로 설정해보았는데도 해결이 되질않습니다..어디설정을 변경시켜줘야되는지 감도잡히질 않아서 질문드립니다.!
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
@types를 dependencies에 넣는 이유?
지난 강좌에서 배포할때는 tsc로 js파일로 바꿔서 쓴다고 했던거 같은데 @types를 왜 dependencies에 넣어야 하죠?1)js파일로 바꾸어도 @types들이 필요한가요?2)아니면 배포환경에서 ts-node를 사용하는건가요? -> 지난강좌에서 효율이 좋지 않다고 하셧던거같은데..
- 해결됨Node.js에 TypeScript 적용하기(feat. NodeBird)
JS에서 babel 사용시 `import * as` 구문을 안써도되는데, 바벨이 esModuleInterop: true 로 처리해주는 것인가요?
JS에서 babel 사용시 import * as 구문을 안써도되는데, 바벨이 esModuleInterop: true 로 처리해주는 것인가요?
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
Sequelize Association 오류
start로 시작한 서버에서는 sequelize가 정상 작동하는데 test를 하면 아래와 같은 오류가 발생합니다 FAIL tests/integration/intergration.test.ts ● Test suite failed to run TypeError: Cannot read properties of undefined (reading 'name') 74 | } 75 | static associate() { > 76 | User.hasMany(Box_1.default, { | ^ 77 | sourceKey: "id", 78 | foreignKey: "UserId" 79 | }); at new HasMany (node_modules/sequelize/src/associations/has-many.js:51:37) at Function.hasMany (node_modules/sequelize/src/associations/mixin.js:34:25) at Function.associate (models/user.js:76:14) at Object.<anonymous> (models/index.js:26:19) at Object.<anonymous> (tests/integration/intergration.test.ts:2:1) Test Suites: 1 failed, 1 total Tests: 0 total Snapshots: 0 total Time: 2.43 s Ran all test suites.sequelize 공식 문서를 보고 그대로 적용해 고쳐보았지만 무엇이 문제인지 잘 모르겠습니다 stackoverflow에서는 sequelize의 오류라고 하는 것 같은데 현재 저의 수준에서는 대화의 내용조차 잘 감이 잡히지 않습니다...공식 문서를 보고 association들을 수정하면 TypeError: Cannot read properties of undefined (reading 'name') 에서 name이 UserId 등으로 바뀐 것도 몇번 보았지만 공식문서에서 나온대로 수정하면 다시 'name'을 읽을때 찾을 수 없다고 나옵니다. 또한at new HasMany (node_modules/sequelize/src/associations/has-many.js:51:37)at Function.hasMany (node_modules/sequelize/src/associations/mixin.js:34:25) 은 들어갈 수 없는 파일처럼 보입니다.import Sequelize, { CreationOptional, InferAttributes, InferCreationAttributes, Model, ForeignKey, } from "sequelize"; import { HasManyAddAssociationMixin, HasManyCountAssociationsMixin, HasManyCreateAssociationMixin, HasManyGetAssociationsMixin, HasManyHasAssociationMixin, } from "sequelize/types/associations"; import Bookmark from "./bookmark.js"; import User from "./user.js"; class Box extends Model<InferAttributes<Box>, InferCreationAttributes<Box>> { declare id: CreationOptional<number>; declare box: string; declare img: string; declare createdAt: CreationOptional<Date>; declare updatedAt: CreationOptional<Date>; declare UserId: ForeignKey<User["id"]>; declare getBookmarks: HasManyGetAssociationsMixin<Bookmark>; declare addBookmarks: HasManyAddAssociationMixin<Bookmark, number>; declare hasBookmarks: HasManyHasAssociationMixin<Bookmark, number>; declare countBookmarks: HasManyCountAssociationsMixin; declare createBookmarks: HasManyCreateAssociationMixin<Bookmark>; static initiate(sequelize: Sequelize.Sequelize) { Box.init( { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true, }, box: { type: Sequelize.STRING(15), allowNull: false, }, img: { type: Sequelize.STRING(200), allowNull: true, }, createdAt: Sequelize.DATE, updatedAt: Sequelize.DATE, }, { sequelize, timestamps: true, underscored: false, modelName: "Box", tableName: "boxs", paranoid: false, charset: "utf8mb4", collate: "utf8mb4_general_ci", } ); } static associate() { Box.belongsTo(User, { targetKey: "id" }); Box.hasMany(Bookmark, { sourceKey: "id", foreignKey: "BoxId", }); } } export default Box;box.ts입니다import Sequelize, { CreationOptional, InferAttributes, InferCreationAttributes, Model, } from "sequelize"; import { HasManyAddAssociationMixin, HasManyCountAssociationsMixin, HasManyCreateAssociationMixin, HasManyGetAssociationsMixin, HasManyHasAssociationMixin, } from "sequelize/types/associations"; import Box from "./Box"; class User extends Model<InferAttributes<User>, InferCreationAttributes<User>> { declare id: CreationOptional<number>; // 'CreationOptional' is a special type that marks the field as optional // id can be undefined during creation when using `autoIncrement` declare email: string; declare nick: string; declare password: CreationOptional<string>; declare provider: CreationOptional<string>; declare snsId: CreationOptional<string>; declare createdAt: CreationOptional<Date>; // createdAt can be undefined during creation declare updatedAt: CreationOptional<Date>; // updatedAt can be undefined during creation declare deletedAt: CreationOptional<Date>; // ... declare getBoxs: HasManyGetAssociationsMixin<Box>; declare addBoxs: HasManyAddAssociationMixin<Box, number>; declare hasBoxs: HasManyHasAssociationMixin<Box, number>; declare countBoxs: HasManyCountAssociationsMixin; declare createBoxs: HasManyCreateAssociationMixin<Box>; static initiate(sequelize: Sequelize.Sequelize) { User.init( { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true, }, email: { type: Sequelize.STRING(40), allowNull: true, unique: true, }, nick: { type: Sequelize.STRING(15), allowNull: false, }, password: { type: Sequelize.STRING(100), allowNull: true, }, provider: { type: Sequelize.ENUM("local", "kakao", "github"), allowNull: false, defaultValue: "local", }, snsId: { type: Sequelize.STRING(30), allowNull: true, }, createdAt: Sequelize.DATE, updatedAt: Sequelize.DATE, deletedAt: Sequelize.DATE, }, { sequelize, timestamps: true, underscored: false, modelName: "User", tableName: "users", paranoid: true, charset: "utf8", collate: "utf8_general_ci", } ); } static associate() { User.hasMany(Box, { sourceKey: "id", foreignKey: "UserId" }); } } export default User; user.ts입니다
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
Sequelize constructor.primaryKeyAttributes 오류
안녕하세요 제로초님 이전에 알려주신 Sequelize 타이핑 덕뿐에 문제 잘 해결했습니다.[0] Executing (default): SELECT `id`, `email`, `nick`, `password`, `provider`, `snsId`, `createdAt`, `updatedAt`, `de letedAt` FROM `users` AS `User` WHERE (`User`.`deletedAt` IS NULL AND `User`.`id` = 1); [0] TypeError: Cannot read properties of undefined (reading 'length') [0] at Box._initValues (C:\workspace\Dev-Mark\server\node_modules\sequelize\lib\model.js:130:49) [0] at new Model (C:\workspace\Dev-Mark\server\node_modules\sequelize\lib\model.js:116:10) [0] at new Box (C:\workspace\Dev-Mark\server\models\box.js:31:1) [0] at Box.build (C:\workspace\Dev-Mark\server\node_modules\sequelize\lib\model.js:1326:12) [0] at Box.create (C:\workspace\Dev-Mark\server\node_modules\sequelize\lib\model.js:1344:23) [0] at C:\workspace\Dev-Mark\server\controller\box.js:36:44 [0] at Generator.next (<anonymous>) [0] at C:\workspace\Dev-Mark\server\controller\box.js:8:71 [0] at new Promise (<anonymous>) [0] at __awaiter (C:\workspace\Dev-Mark\server\controller\box.js:4:12) [0] C:\workspace\Dev-Mark\server\node_modules\sequelize\lib\model.js:83 [0] for (const key of Object.keys(this.constructor._attributeManipulation)) { [0] ^ [0] [0] TypeError: Cannot convert undefined or null to object [0] at Function.keys (<anonymous>) [0] at Timeout._onTimeout (C:\workspace\Dev-Mark\server\node_modules\sequelize\lib\model.js:83:34) [0] at listOnTimeout (node:internal/timers:564:17) [0] at process.processTimers (node:internal/timers:507:7) [0] [0] Node.js v18.13.0 [1] [HPM] Error occurred while proxying request localhost:3000/api/box/ to http://localhost:5000/ [ECONNRESET] (https ://nodejs.org/api/errors.html#errors_common_system_errors) [0] npm run server exited with code 1 --> Sending SIGTERM to other processes.. [1] npm run client exited with code 1이번에는 라는 오류가 나오는데요,stackoverflow를 읽어보니 default value를 지정하라는 말도 있고 init을 하지 않았다는 말도 있는데 둘 다 제 케이스에는 해당하지 않는 것 같습니다.sequelize 공식문서에서도 읽어보았지만 문제가 뭔지 잘 모르겠습니다...Box.js (변환)"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const sequelize_1 = __importStar(require("sequelize")); const user_js_1 = __importDefault(require("./user.js")); class Box extends sequelize_1.Model { static initiate(sequelize) { Box.init({ id: { type: sequelize_1.default.INTEGER, primaryKey: true, autoIncrement: true, }, box: { type: sequelize_1.default.STRING(15), allowNull: false, }, img: { type: sequelize_1.default.STRING(200), allowNull: true, }, createdAt: sequelize_1.default.DATE, updatedAt: sequelize_1.default.DATE, }, { sequelize, timestamps: true, underscored: false, modelName: "Box", tableName: "boxs", paranoid: false, charset: "utf8mb4", collate: "utf8mb4_general_ci", }); } static associate() { Box.belongsTo(user_js_1.default); } } exports.default = Box; box.tsimport Sequelize, { CreationOptional, InferAttributes, InferCreationAttributes, Model, ForeignKey, } from "sequelize"; import User from "./user.js"; class Box extends Model<InferAttributes<Box>, InferCreationAttributes<Box>> { declare id: CreationOptional<number>; declare box: string; declare img: string; declare createdAt: CreationOptional<Date>; declare updatedAt: CreationOptional<Date>; declare UserId: ForeignKey<User["id"]>; static initiate(sequelize: Sequelize.Sequelize) { Box.init( { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true, }, box: { type: Sequelize.STRING(15), allowNull: false, }, img: { type: Sequelize.STRING(200), allowNull: true, }, createdAt: Sequelize.DATE, updatedAt: Sequelize.DATE, }, { sequelize, timestamps: true, underscored: false, modelName: "Box", tableName: "boxs", paranoid: false, charset: "utf8mb4", collate: "utf8mb4_general_ci", } ); } static associate() { Box.belongsTo(User); } } export default Box; user.tsimport Sequelize, { CreationOptional, InferAttributes, InferCreationAttributes, Model, BelongsToManyAddAssociationMixin, NonAttribute, } from "sequelize"; class User extends Model<InferAttributes<User>, InferCreationAttributes<User>> { declare id: CreationOptional<number>; // 'CreationOptional' is a special type that marks the field as optional // id can be undefined during creation when using `autoIncrement` declare email: string; declare nick: string; declare password: CreationOptional<string>; declare provider: CreationOptional<string>; declare snsId: CreationOptional<string>; declare createdAt: CreationOptional<Date>; // createdAt can be undefined during creation declare updatedAt: CreationOptional<Date>; // updatedAt can be undefined during creation declare deletedAt: CreationOptional<Date>; // ... static initiate(sequelize: Sequelize.Sequelize) { User.init( { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true, }, email: { type: Sequelize.STRING(40), allowNull: true, unique: true, }, nick: { type: Sequelize.STRING(15), allowNull: false, }, password: { type: Sequelize.STRING(100), allowNull: true, }, provider: { type: Sequelize.ENUM("local", "kakao", "github"), allowNull: false, defaultValue: "local", }, snsId: { type: Sequelize.STRING(30), allowNull: true, }, createdAt: Sequelize.DATE, updatedAt: Sequelize.DATE, deletedAt: Sequelize.DATE, }, { sequelize, timestamps: true, underscored: false, modelName: "User", tableName: "users", paranoid: true, charset: "utf8", collate: "utf8_general_ci", } ); } static associate() { } } export default User; index.tsimport Sequelize from 'sequelize'; import configObj from '../config/config.js'; import User from './user.js'; import Post from './post.js'; import Hashtag from './hashtag.js'; import Alarm from './alarm.js'; import Bookmark from './bookmark.js'; import Box from './Box.js'; const env = process.env.NODE_ENV as 'production' | 'test' || 'development'; const config = configObj[env]; export const sequelize = new Sequelize.Sequelize( config.database, config.username, config.password, config, ); Alarm.initiate(sequelize); Bookmark.initiate(sequelize); Box.initiate(sequelize); Hashtag.initiate(sequelize); Post.initiate(sequelize); User.initiate(sequelize); Alarm.associate(); Bookmark.associate(); Box.associate(); Hashtag.associate(); Post.associate(); User.associate();
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
Sequelize에 요청을 보내면 오류가 뜹니다
수업 보면서 포트폴리오를 작성하고 있습니다...Sequelize를 통해서 DB에 POST요청을 보내면TypeError: Class constructor Model cannot be invoked without 'new'라는 오류가 발생합니다.Typescript의 버전이 ES6가 아닐 때 시퀼라이즈에서 이러한 오류가 발생한다고 해서 tsconfig에 'target' = 'ES6' 로 지정하니 그때부터 강의를 기반으로 만들어온 모듈 import가 전부 어긋나게 됩니다...메인페이지의 import * as ... 구문은 어떻게든 수정하겠는데 현재 강의 방식이 아닌 Typescript DB작성 방식을 모르기 때문에 어디서부터 손을 대야 할지도 모르겠습니다 ES6모듈로 전환하지 않고 해당 오류를 해결할 방법이 있을까요? 아니면 ORM을 아예 바꿔야 할까요?
- 해결됨Node.js에 TypeScript 적용하기(feat. NodeBird)
강좌에서 사용된 3개의 코드 의미가 궁금합니다 [ 코드 : 1. [ key:string]:string] 2. delete user.password , 3.passport.deserializeUser<number> ]
안녕하세요, 제로초 님,강의 덕분에, 타입 없는 라이브러리도 도전?해볼 수 있게 됐습니다. :]강좌 보면서 3가지 코드 관련해 궁금해 문의 드립니다1. '시퀄라이즈', 18:22, '[key:string]:string' 2. '라우터 만들기' , 6:05, delete user.password;3. serializeUser와 deserializeUser 에러해결 코드, passport.deserializeUser<number>타입스크립트 관련해 고민했던 내용이 '맞는지' 확인 받고 싶습니다,감사합니다:]#1.'시퀄라이즈' 18:22, '[key:string]:string'config의 타입을 만들때,'[key:string]:string' 코드를 넣는 이유가 궁금합니다 'dialect'의 타입부분이 유동적으로 변하기 때문에,기본 틀(key는 string, value는 string) 목적으로 작성하는 것인가요? const { database, username, password } = config[env]; 처럼,key에 해당하는 value를 찾기 위해서'[key:string]:string'가 필요한지 궁금합니다. (검색해보면, 타입스크립트 Index Signature 관련해 글이 나옵니다)타입스크립트에서 객체의 key로 value를 찾을 때,에러 해결 코드로'[key:string]:string'를 넣어보라는 글을 읽은적이 있는데요,제가 생각하는 추리가 맞는건지요? #2.'라우터 만들기' 파트, 6:05 에서 const user = req.user?.toJSON() as User; delete user.password; return res.json(user); 'delete user.password;'어떤 이유로user의 passord를 지우는건가요?코드 흐름에서유저의 비밀번호를 지우는게(delete) 어떤 의미인건지 궁금합니다. #3.passport.deserializeUser<number>serializeUser와 deserializeUser 에러 관련해 올려주신 코드에서,deserializeUser에 제네릭 <number>을 어떻게 넣을 수 있으셨는지 '그 방법이' 궁금해 문의드립니다. passport.deserializeUser<number>(async (id, done) => { ...중략...});passport.deserializeUser 의 id가user의 id이고,id의 타입이 number 이기 때문에제네릭 number을 넣으신거라고 이해했는데요, passport.deserializeUser 메서드를 마우스 호버해보니(method) passport.Authenticator<e.Handler, any, any, passport.AuthenticateOptions>.deserializeUser<unknown>(fn: (id: unknown, done: (err: any, user?: false | Express.User | null | undefined) => void) => void): void (+1 overload)deserializeUser의 제네릭 타입이 id와 연결되어 있습니다, deserializeUser<unknown> ,id: unknownpassport.deserializeUser<number>라고 코드를 변경하니deserializeUser 메서드와 id 타입이 number 타입으로 바인딩되서 나옵니다, (method) passport.Authenticator<e.Handler, any, any, passport.AuthenticateOptions>.deserializeUser<number>(fn: (id: number, done: (err: any, user?: false | Express.User | null | undefined) => void) => void): void (+1 overload) 혹시,타입스크립트에서 타입을 제대로 넣으려면( = 타입스크립트를 제대로 사용하려면),함수/변수 를 클릭해 index.d.ts를 이리저리 읽어보거나,Vscode가 알려주는 타입을 확인하는 습관이 중요한건지요?(당연, 자바스크립트를 잘 아는 것도 중요하지만,,) 강좌에서 말씀 해주셨던 내용들이랑위의 serializeUser와 deserializeUser 에러 리팩토링 된 코드를 보면서제대로 생각 정리가 됐는지 궁금해 문의드립니다.
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
@mui/x-data-grid 에 사용자정의 컬럼 타입을 추가해서 사용하려고 합니다.
@mui/x-data-grid 패키지를 사용해서 type= "time" 을 추가 해 보려고 합니다. 검색을 해보니 공식문서에서는 커스터마이징 해서 사용할수있다고 하는 글을 보았습니다.제가 필요한 time picker 부분을 추가하는 부분은 찾지 못했습니다. ㅠ.ㅠhttps://mui.com/x/react-data-grid/column-definition/#custom-column-types @mui/x-data-grid 에서 기본 제공하는 타입들은 아래와 같습니다.'string' (default)'number''date''dateTime''boolean''singleSelect''actions' 위에 보시다 시피 'time' 이 없습니다... ㅠ.ㅠ 구글링 해보니 아래 부분에https://github.com/mui/mui-x/issues/5421 글에서7월12일에 time 열이 추가 되었다고 하는것 같은데..관련된 파일이 아래 gridDateColDef.ts, gridDateOperators.ts 두가지 파일로 보이며커스터마이징이 필요할것을 보여집니다.https://github.com/mui/mui-x/blob/master/packages/grid/x-data-grid/src/colDef/gridDateColDef.tsimport { gridDateComparator } from '../hooks/features/sorting/gridSortingUtils'; import { getGridDateOperators } from './gridDateOperators'; import { GRID_STRING_COL_DEF } from './gridStringColDef'; import { GridColTypeDef } from '../models/colDef/gridColDef'; import { renderEditDateCell } from '../components/cell/GridEditDateCell'; import { GridValueFormatterParams } from '../models/params/gridCellParams'; export function gridDateFormatter({ value }: GridValueFormatterParams<Date | string>) { if (value instanceof Date) { return value.toLocaleDateString(); } return value ?? ''; } export function gridDateTimeFormatter({ value }: GridValueFormatterParams<Date | string>) { if (value instanceof Date) { return value.toLocaleString(); } return value ?? ''; } export const GRID_DATE_COL_DEF: GridColTypeDef<Date | string, string> = { ...GRID_STRING_COL_DEF, type: 'date', sortComparator: gridDateComparator, valueFormatter: gridDateFormatter, filterOperators: getGridDateOperators(), renderEditCell: renderEditDateCell, getApplyQuickFilterFn: undefined, }; export const GRID_DATETIME_COL_DEF: GridColTypeDef<Date | string, string> = { ...GRID_STRING_COL_DEF, type: 'dateTime', <======= 이 타이블 수정 sortComparator: gridDateComparator, valueFormatter: gridDateTimeFormatter, filterOperators: getGridDateOperators(true), renderEditCell: renderEditDateCell, getApplyQuickFilterFn: undefined, }; colDef 폴더에 gridDateColDef.ts 파일에서는 type 이 time 인 컬럼 속성은 보이지 않습니다. mui x data grid 예시 파일을 열어서 아래https://codesandbox.io/s/d13q7i?file=/demo.tsx import * as React from "react"; import Box from "@mui/material/Box"; import { DataGrid, GridColTypeDef } from "@mui/x-data-grid"; import { randomStatusOptions, randomPrice, randomCreatedDate } from "@mui/x-data-grid-generator"; const rows = [ { id: 1, status: randomStatusOptions(), subTotal: randomPrice(), total: randomPrice(), date: randomCreatedDate(), time: "05:45" }, { id: 2, status: randomStatusOptions(), subTotal: randomPrice(), total: randomPrice(), date: randomCreatedDate(), time: "05:45" }, { id: 3, status: randomStatusOptions(), subTotal: randomPrice(), total: randomPrice(), date: randomCreatedDate(), time: "05:45" } ]; const currencyFormatter = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" }); const usdPrice: GridColTypeDef = { type: "number", width: 200, valueFormatter: ({ value }) => currencyFormatter.format(value), cellClassName: "font-tabular-nums" }; export default function CustomColumnTypesGrid() { return ( <Box sx={{ height: 300, width: "100%", "& .font-tabular-nums": { fontVariantNumeric: "tabular-nums" } }} > <DataGrid columns={[ { field: "status", width: 130 }, { field: "subTotal", ...usdPrice, editable: true }, { field: "total", ...usdPrice }, { field: "time", editable: true }, { field: "date", type: "dateTime", width: 200, editable: true } ]} rows={rows} /> </Box> ); } <DataGrid columns={[ { field: "status", width: 130 }, { field: "subTotal", ...usdPrice, editable: true }, { field: "total", ...usdPrice }, { field: "time", editable: true }, { field: "date", type: "dateTime", width: 200, editable: true } ]} rows={rows} /> 위에 일자와 시간을 선택할수 있는 셀렉터를 아래 time picker 만 나오도록 custumizing 할수 있는 팁을 주실수 있을까요?
- 해결됨Node.js에 TypeScript 적용하기(feat. NodeBird)
미들웨어 에러
위와 같은 에러가 발생하는데 강의에서 설명해주신 방법들은 다 해본 것 같은데 해결이 안됩니다.원인과 솔루션 부탁드립니다authJWT 미들웨어 import와 선언 부분에선 아래와 같이 에러는 없었습니다
- 해결됨Node.js에 TypeScript 적용하기(feat. NodeBird)
Could not find a declaration file for mould '../utils/jwt-utils'
현재 진행하고잇는 프로젝트를 ts파일로 변환하고 있는데 가져오는거(import)에서 타이핑 오류가 발생하는게 아니라 가져오는 곳(from)에서 오류가 발생했는데 위의 오류대로 Could not find a declaration file for...... 을 검색해봐도 해결 방법을 모르겠어 질문 글 올립니다 const jwt from '../utils/jwt-utils' 은 잘 작동합니다 솔루션 부탁드립니다
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
마지막에 type과 interface 추가하는 부분
type에 들어가는 [key: string]: string이 어떻게 작동하는지 알려주실 수 있나요?
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
다른 컴퓨터에서 제가 만든 DB 테이블의 데이터를 그대로 사용하려면?
안녕하세요 제로초님!기업 과제를 준비하면서 궁금한 점이 생겼는데요.프로젝트를 마치고 테스트하다 보면 데이터들이 DB에 쌓이잖아요?? (회원가입 유저, 게시물 작성 등.)다른 컴퓨터에서 제 프로젝트를 클론해서 서버를 돌렸을 때, 해당 DB에 데이터를 그대로 유지하려면 어떻게 해야되나요??
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
express 모듈 에러 관련
express를 alias로 import하여 사용했는데, 아래와 같은 에러가 발생합니다. default import를 사용하라는 것 같은데, 어찌하면 alias를 유지하면서 에러를 없앨 수 있을까요?
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
import * as A from 'B'
해당 문법을 뭐라고 명명하시는 건가요?? 애즈터리스크애즈라고 하시는 것 같은데, 개인적으로 궁금해서 여쭤봐요...!
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
MySql ssl 보안 옵션 질문 입니다.
안녕하세요. 제로초님~ 강의 보면서 기존의 js 서버를 ts 로 바꾸고 있었는데요. 저는 mysql을 클라우드 서버에 생성해서 작업하고 있습니다. 클라우드의 mysql에 보안 설정으로 ssl설정을 켜둔 상태라 기존 js 서버의 config에 ssl: true, dialectOptions: { ssl: { require: true } 이렇게 설정이 들어가 있었는데 강의 내용대로 ts 로 바꾸려 하니 잘 안되서 질문 드립니다. booean 타입과 object 타입은 어떤 식으로 변경 해야 할까요?
- 해결됨Node.js에 TypeScript 적용하기(feat. NodeBird)
passport/index.ts 에러 입니다
안녕하세요! passport/index.ts에서 에러가 발생합니다. 공지사항에 남겨주신 부분 참고해서 types/index.d.ts에 추가도 하였는데 에디터에는 에러가 발생하지 않고 nodemon으로 실행을 하니 에러가 발생합니다. 다른 질문들 찾아보니 npx tsx --noEmit 이 있어서 해봤더니 이 명령어에서는 에러가 발생하지 않습니다. 아래는 에러 및 코드 입니다!
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
routes/post.ts 페이지에서 에러나요..
routes/post.ts에서 const promises: BluBird<Image> = req.body.image.map((image: string) => Image.create({src: image})) 이렇게 하고 다음에 const images = await Promise.all(promises); promises에서 에러납니다.. 이 호출과 일치하는 오버로드가 없습니다.오버로드 1/2('(values: readonly unknown[] | []): Promise<[] | unknown[]>')에서 다음 오류가 발생했습니다.'Bluebird<Image>' 형식의 인수는 'readonly unknown[] | []' 형식의 매개 변수에 할당될 수 없습니다.'Bluebird<Image>' 형식은 '[]' 형식에 할당할 수 없습니다.오버로드 2/2('(values: Iterable<unknown>): Promise<unknown[]>')에서 다음 오류가 발생했습니다.'Bluebird<Image>' 형식의 인수는 'Iterable<unknown>' 형식의 매개 변수에 할당될 수 없습니다.'[Symbol.iterator]' 속성이 'Bluebird<Image>' 형식에 없지만 'Iterable<unknown>' 형식에서 필수입니다.ts(2769) lib.es2015.iterable.d.ts(51, 5): 여기서는 '[Symbol.iterator]'이(가) 선언됩니다. 이런 에러가 나와요..
- 미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
passport/index.ts 에러납니다...
passport.serializeUser((user: User, done) => { done(null, user.id); }); (user: User, done) 여기에서 (alias) class Userimport User 이 호출과 일치하는 오버로드가 없습니다.오버로드 1/2('(fn: (user: User, done: (err: any, id?: unknown) => void) => void): void')에서 다음 오류가 발생했습니다.'(user: import("c:/D/maxerve/code/git_hsh/node_restful_api/lecture/back/models/user").default, done: (err: any, id?: unknown) => void) => void' 형식의 인수는 '(user: Express.User, done: (err: any, id?: unknown) => void) => void' 형식의 매개 변수에 할당될 수 없습니다.'user' 및 'user' 매개 변수의 형식이 호환되지 않습니다.'User' 형식에 'User' 형식의 id, nickname, userId, password 외 37개 속성이 없습니다.오버로드 2/2('(fn: (req: IncomingMessage, user: User, done: (err: any, id?: unknown) => void) => void): void')에서 다음 오류가 발생했습니다.'(user: User, done: (err: any, id?: unknown) => void) => void' 형식의 인수는 '(req: IncomingMessage, user: User, done: (err: any, id?: unknown) => void) => void' 형식의 매개 변수에 할당될 수 없습니다.'user' 및 'req' 매개 변수의 형식이 호환되지 않습니다.'IncomingMessage' 형식에 'User' 형식의 id, nickname, userId, password 외 36개 속성이 없습니다. 이렇게 에러가나요..