en
Feedback
ToCode

ToCode

Open in Telegram

讟讬驻讬诐 拽爪专讬诐 诇诪转讻谞转讬诐 诪讗转 讬谞讜谉 驻专拽

Show more
1 419
Subscribers
No data24 hours
No data7 days
-230 days
Posts Archive
ToCode
1 419
# 讛讬讜诐 诇诪讚转讬: 砖诇讬驻转 诪讬讚注 诪 JSON 讘讗诪爪注讜转 JSON-ptr 讗转 xpath 讗谞讬 诪讻讬专 讛专讘讛 讝诪谉 讗讘诇 专拽 讛讬讜诐 讙讬诇讬转讬 砖讬砖 诇讜 诪拽讘讬诇讛 讜讜转讬拽讛 砖转注讝讜专 诇谞讜 诇诪砖讜讱 诪讬讚注 讘拽诇讜转 诪讗讜讘讬拽讟讬 JSON. 讝讛 谞拽专讗 jsonptr 讜讻讘专 讬砖 注讘讜专讜 诪住诪讱 讗讬驻讬讜谉 砖诇 IETF 砖谞拽专讗 rfc6901 讜诪住驻专 诪讬诪讜砖讬诐 讘 JavaScript 讜讘砖驻讜转 讗讞专讜转. 讘讜讗讜 谞专讗讛 讗讬讱 讝讛 注讜讘讚. ## 诇诪讛 爪专讬讱 诇诪砖讜讱 诪讬讚注 诪 JSON 谞转讜谉 讗讜讘讬拽讟 讛 JSON 讛讘讗:
const data = {
    items: [ 'one', 'two', 'three' ],
    colors: [
        { name: 'red', score: 7 },
        { name: 'blue', score: 9 },
        { name: 'green', score: 15 },
    ],
};
讜讗谞讞谞讜 专讜爪讬诐 诇讙诇讜转 诪讛 讛砖诐 砖诇 讛爪讘注 讛专讗砖讜谉. 讘讬讜诐 专讙讬诇 讛讬讬谞讜 讬讻讜诇讬诐 诇讻转讜讘 讗转 拽讜讚 讛 JavaScript 讛讘讗:
data.colors[0].name;
讗讘诇: 1. 讛拽讜讚 讬讬砖讘专 讗诐 诪讘谞讛 讛讗讜讘讬拽讟 砖讜谞讛 2. 谞讚专砖 砖讬谞讜讬 拽讜讚 讻诇 驻注诐 砖诪砖谞讬诐 讗转 诪讘谞讛 讛讗讜讘讬拽讟. ## 讗讬讱 JSON ptr 注讜讝专 诇驻转讜专 讗转 讛讘注讬讛 讛讗讬驻讬讜谉 砖诇 JSON Ptr 讛讜讗 诪讗讜讚 驻砖讜讟: 讗谞讞谞讜 诪注讘讬专讬诐 诇讜 诪讞专讜讝转 砖诪讬讬爪讙转 谞转讬讘 讘转讜讱 讛 JSON 讜讛讜讗 诪讞讝讬专 诇谞讜 讗转 讛注专讱 砖谞诪爪讗 砖诐. 讝讛 拽爪转 讻诪讜 XPath 专拽 讘诇讬 讻诇 讛讬讻讜诇讜转 讛砖讜讜转. 讛拽讜讚 讛讘讗 诪砖转诪砖 讘住驻专讬讬转 json-ptr 讻讚讬 诇诪砖讜讱 讗转 讛砖诐 砖诇 讛爪讘注 讛专讗砖讜谉 诪讗讜讘讬拽讟 讛诪讬讚注:
import { JsonPointer } from "json-ptr";
const ptr = JsonPointer.create("/colors/0/name");
const name = ptr.get(data);
讗讝 谞讻讜谉 讗驻砖专 讛讬讛 诇砖诪讜专 讻诇 诪讞专讜讝转 讘转讜专 "谞转讬讘" 讜诇讻转讜讘 讘注爪诪谞讜 讗转 讛拽讜讚 砖诪讞驻砖 讘讗讜讘讬拽讟 讗讜 诇讛砖转诪砖 讘住驻专讬讛 讻诪讜 object-dig 讻讚讬 诇拽讘诇 讗转 讗讜转讛 转讜爪讗讛, 讗讘诇 讘讻诇 讝讗转 讝讛 谞讞诪讚 砖讛诪讞专讜讝转 砖诇谞讜 讻转讜讘讛 诇驻讬 转拽谉 讜砖讬讛讬讛 讗驻砖专 讘拽诇讜转 诇讛讞诇讬祝 诪讬诪讜砖. ## 诪讛 注讜砖讬诐 注诐 讝讛 讘讞讬讬诐 讛讗诪讬转讬讬诐 诪谞讙谞讜谉 砖诇 讙讬砖讛 诇注专讱 讘 JSON 诇驻讬 讬讬爪讜讙 诪讞专讜讝转讬 砖诇 讛谞转讬讘 讗诇讬讜 讬讻讜诇 诇注讝讜专 诇谞讜 讘诪拽专讬诐 讛讘讗讬诐: 1. 讻砖讛 API 砖诇讬 爪专讬讱 诇转诪讜讱 讘诪住驻专 诪讘谞讬诐 砖诇 讗讜讘讬拽讟讬诐 (诇诪砖诇 讗讞专讬 砖讬谞讜讬 讙讬专住讛), 讗谞讬 讬讻讜诇 诇砖诪讜专 讗转 讛谞转讬讘 讛诪转讗讬诐 诇讻诇 讙讬专住讛 讜讻讱 驻讜谞拽爪讬讬转 讛讟讬驻讜诇 讘砖专转 讬讻讜诇讛 诇讛转诪讜讚讚 注诐 讗讜讘讬拽讟讬诐 诪砖谞讬 讛住讜讙讬诐 讘爪讜专讛 讙谞专讬转. 2. 讻砖讗谞讬 专讜爪讛 诇讗驻砖专 诇诪砖转诪砖讬诐 诇讘讞讜专 注专讻讬诐 诪住讜讬诪讬诐 讘 JSON 讜讗谞讬 专讜爪讛 诇砖诪讜专 (讘砖专转 讗讜 讘 local storage) 讗转 讛讘讞讬专讛 砖诇讛诐, 讻讱 砖讙诐 讗诐 讛 JSON 讬砖转谞讛 讛讘讞讬专讛 转转注讚讻谉 讘讛转讗诐.

ToCode
1 419
讛讚讘专 讛谞讻讜谉 诇注砖讜转 讛讬讛 诇讗驻砖专 诇诪砖转诪砖讬诐 诇讛讙讚讬专 2FA 讘讗诪爪注讜转 讗驻诇讬拽爪讬讬转 Authenticator 讗讜 讘讗诪爪注讜转 住诪住 讗讜 拽讜讚 拽讜诇讬, 讻讚讬 砖诪砖转诪砖讬诐 砖讻谉 专讜爪讬诐 诇讛讙谉 注诇 注爪诪诐 讬讜讻诇讜 诇讘讞讜专 讘讗讜驻爪讬讛 讛诪讗讜讘讟讞转. 讘谞讜住祝 讬砖 诇讛讙讚讬专 诪讚讬谞讬讜转 住讬住诪讗讜转 砖诪讞讬讬讘转 诪砖转诪砖讬诐 诇讘讞讜专 住讬住诪讛 讗专讜讻讛 讜讬讬讞讜讚讬转 讜诇讛讞诇讬祝 住讬住诪讛 讻诇 诪住驻专 讞讜讚砖讬诐, 诇讝讛讜转 讛转谞讛讙讜转 讞砖讜讚讛 砖诇 诪砖转诪砖讬诐 讗讜 讻谞讬住讛 诪诪拽讜诪讜转 诇讗 砖讙专转讬讬诐 讗讜 诪诪讻砖讬专讬诐 诇讗 讘谞讜住祝 讬砖 诇讛讙讚讬专 诪讚讬谞讬讜转 住讬住诪讗讜转 砖诪讞讬讬讘转 诪砖转诪砖讬诐 诇讘讞讜专 住讬住诪讛 讗专讜讻讛 讜讬讬讞讜讚讬转 讜诇讛讞诇讬祝 住讬住诪讛 讻诇 诪住驻专 讞讜讚砖讬诐. 讻讚讗讬 讙诐 诇讛讜住讬祝 诪谞讙谞讜谞讬诐 讛诪讝讛讬诐 讛转谞讛讙讜转 讞砖讜讚讛 砖诇 诪砖转诪砖讬诐 讗讜 讻谞讬住讛 诪诪拽讜诪讜转 诇讗 砖讙专转讬讬诐 讗讜 诪诪讻砖讬专讬诐 诇讗 砖讙专转讬讬诐.

ToCode
1 419
# 诪讛 讬讜转专 诪讗讜讘讟讞: 住诪住 讗讜 诪砖转诪砖 讜住讬住诪讛? 讘诪讬讬诇 砖拽讬讘诇转讬 诪讞讘专转 讛讞砖诪诇 诇讗讞专讜谞讛 讛诐 住讬驻专讜 砖诪讞诇讬驻讬诐 讗转 诪谞讙谞讜谉 讛讗讘讟讞讛 讜讘诪拽讜诐 诇讛诪砖讬讱 诇讛讬讻谞住 注诐 砖诐 诪砖转诪砖 讜住讬住诪讛 讻诪讜 砖讛讬讬谞讜 注讜砖讬诐 讛讻谞讬住讛 诪注讻砖讬讜 转讛讬讛 专拽 讘讗诪爪注讜转 住诪住 诇讟诇驻讜谉 讛谞讬讬讚, 讻讬 讝讜 爪讜专讛 讬讜转专 诪讗讜讘讟讞转. 讘讙诇诇 砖讗谞讬 讘讟讜讞 砖讛讛转诇讘讟讜转 诇讗 讬讬讞讜讚讬转 专拽 诇讞讘专转 讛讞砖诪诇, 讘讜讗讜 谞驻转讞 讗转 讝讛 讻讚讬 诇讛讬讜转 讘讟讜讞讬诐. ## 讻谞讬住讛 注诐 砖诐 诪砖转诪砖 讜住讬住诪讛 讛诪谞讙谞讜谉 讛专讙讬诇 砖诇 讻谞讬住讛 诇讗转专讬诐 讗讜诪专 砖讻诇 诪砖转诪砖 讘讜讞专 诇注爪诪讜 砖诐 诪砖转诪砖 讜住讬住诪讛 讜讻诇 诪讬 砖讬讜讚注 讗转 砖谞讬 讛驻专讟讬诐 讛讗诇讛 讬讻讜诇 诇讛讬讻谞住 诇讗转专. 诪讘讞讬谞转 讛讗转专 诪诇讘讚 讛住讬住诪讛 讜砖诐 讛诪砖转诪砖 讗讬谉 注讜讚 讻诇讜诐 砖诪讝讛讛 讗转 讛讘谉 讗讚诐, 讜诇讻谉 讗诐 诪讬砖讛讜 讬讙诇讛 讗转 讛住讬住诪讛 砖诇讻诐 讛讜讗 讬讜讻诇 诇讛讝讚讛讜转 讘砖诪讻诐 讘讗讜转讜 讗转专. 讗谞讞谞讜 讬讜讚注讬诐 讻讘专 讛专讘讛 讝诪谉 砖诪注专讻转 讻谞讬住讛 讛诪讘讜住住转 注诇 砖诐 诪砖转诪砖 讜住讬住诪讛 诇谞转讜谞讬诐 驻专讟讬讬诐 讗讬谞讛 诪住驻讬拽 诪讗讜讘讟讞转 讜讝讗转 诪讛住讬讘讜转 讛讘讗讜转: 1. 讗谞砖讬诐 诇讗 讬讜讚注讬诐 诇砖诪讜专 住讬住诪讗讜转 讘住讜讚: 专讜讘 讛讗谞砖讬诐 讬转谞讜 讗转 讛住讬住诪讛 砖诇讛诐 讘讟诇驻讜谉 讻砖谞爪讬讙 砖讬专讜转 讚诪讬讜谞讬 诪转拽砖专 讜讞诇拽 诪讛讗谞砖讬诐 讬转谞讜 讗转 讛住讬住诪讛 讘转诪讜专讛 诇讞讟讬祝. 2. 讙诐 讗诐 讛讬讬谞讜 讬讜讚注讬诐 诇砖诪讜专 住讬住诪讗讜转 诪讞砖讘讬诐 讛诐 诪谞讜讜诇讬诐: 拽诇 诪讗讜讚 诇讛讻谞讬住 讜讬专讜住 砖诪讗讝讬谉 诇诇讞讬爪讜转 诪拽诇讚转 讜砖讜诇讞 住讬住诪讗讜转 诇诪专讻讝 砖诇讬讟讛 讜讘拽专讛. 3. 讙诐 讗诐 讛讬讬谞讜 讬讜讚注讬诐 诇讛转诪讜讚讚 注诐 讜讬专讜住讬诐 讗转专讬诐 讛诐 诪谞讜讜诇讬诐: 讗谞讞谞讜 谞讜讟讬诐 诇讘讞讜专 讗转 讗讜转讛 住讬住诪讛 诇讻诇 讛讗转专讬诐, 诇诪专讜转 砖讞诇拽 诪讛讗转专讬诐 讛诐 讻谞专讗讛 讝讚讜谞讬讬诐 讗讜 驻砖讜讟 讻转讜讘讬诐 专注 讜诇讻谉 讘诪讜拽讚诐 讗讜 讘诪讗讜讞专 讛住讬住诪讛 砖诇谞讜 转讬讞砖祝. 讻谞讬住讛 注诐 砖诐 讜住讬住诪讛 讬讻讜诇讛 诇注讘讜讚 专拽 讗诐 讛诪砖转诪砖讬诐 讬讜讚注讬诐 砖注诇讬讛诐 诇讘讞讜专 住讬住诪讗讜转 讗专讜讻讜转 讜诪讗讜讘讟讞讜转 讜讬讬讞讜讚讬讜转 诇讻诇 讗转专. 讘讗转专 https://haveibeenpwned.com/ 转讜讻诇讜 诇讙诇讜转 诇讗谉 讛转讙诇讙诇讜 讛砖诐 讜讛住讬住诪讛 砖诇讻诐 诇诪讙讜讜谉 讗转专讬诐 讗诇讬讛诐 谞专砖诪转诐. 讛讘讚讬拽讛 砖诐 讛讬讗 讞讜讜讬讛 诪讟诇讟诇转. 诇讻谉 讗转专讬诐 专讘讬诐 讜讘诪讬讜讞讚 讗转专讬诐 讛砖讜诪专讬诐 诪讬讚注 驻专讟讬 注讘专讜 诇讛砖转诪砖 讘住讻讬诪讛 诪转讜讞讻诪转 讬讜转专 砖谞拽专讗转 2FA 讗讜 Two Factor Authentication. 讘诪爪讘 注讘讜讚讛 讻讝讛 讛讗转专 讬讘拽砖 诪讻诐 诇讛讝讚讛讜转 注诐 砖诐 诪砖转诪砖 讜住讬住诪讛, 讜诇讗讞专 诪讻谉 讗诐 讗转诐 诪转讞讘专讬诐 诪诪讻砖讬专 砖讗转诐 诇讗 谞讜讛讙讬诐 诇讛转讞讘专 诪诪谞讜 讗讜 诪诪拽讜诐 讙讬讗讜讙专驻讬 砖讗转诐 诇讗 谞讜讛讙讬诐 诇讛讬讜转 讘讜, 讛讗转专 讙诐 讬讘拽砖 诪讻诐 诇讗诪转 讗转 讝讛讜转讻诐 讘讗诪爪注讬 谞讜住祝. 讛讗诪爪注讬 讛驻讜驻讜诇专讬 讘讬讜转专 诇诪讬诪讜砖 2FA 讛讜讗 砖诇讬讞转 住诪住 诇讟诇驻讜谉 讛谞讬讬讚. 讝讛讜 讗诪爪注讬 谞讜讞 讻讬 讻讜诇诐 讬讜讚注讬诐 诇拽讘诇 住诪住, 讗讘诇 讛讜讗 讙诐 诇讗 诪讗讜讚 诪讗讜讘讟讞 讻讬 住诪住讬诐 讛诐 诇讗 诪讗讜讘讟讞讬诐 诪讟讘注诐: 讞讘专转 讛讟诇驻讜谉 讜讙诐 讗驻诇讬拽爪讬讜转 砖讛转拽谞讜 注诇 讛讟诇驻讜谉 讬讻讜诇讬诐 讘拽诇讜转 诇拽专讜讗 讗转 讛讛讜讚注讜转. 诇讻谉 讛讬讜诐 谞讛讜讙 诇讛诪诇讬抓 诇诪诪砖 2FA 讘讗诪爪注讜转 讗驻诇讬拽爪讬讬转 Authenticator 讻诪讜 Google Authenticator. 讛诪谞讙谞讜谉 砖诇 讛 Authenticator 讛讜讗 砖讛讗驻诇讬拽爪讬讛 诪讙专讬诇讛 讻诇 讞爪讬 讚拽讛 拽讜讚 驻住讗讜讚讜 讗拽专讗讬 讞讚砖 讗讘诇 砖谞讙讝专 诪转讜讱 讗讬讝砖讛讜 Seed 专讗砖讜谞讬. 讘讛谞讞讛 砖讛 Seed 讗爪诇讬 注诇 讛诪讻砖讬专 讜讘讗转专 讛讜讗 讝讛讛, 讗讝 讛拽讜讚讬诐 砖讛讗驻诇讬拽爪讬讛 转讬讬爪专 转诪讬讚 讬讛讬讜 讝讛讬诐 讗爪诇讬 讜讘讗转专 讜讬讬讞讜讚讬讬诐. 讛讻谞住转 讛拽讜讚 诪讛 Authenticator 诪讘讟讬讞讛 砖讗讻谉 讬砖 诇讬 讙讬砖讛 诇讗讜转讜 诪谞讙谞讜谉 讬爪讬专转 拽讜讚讬诐 讗讬转讜 谞专砖诪转讬 诇讗转专. ## 讻谞讬住讛 注诐 住诪住 讗讞专讬 讟讬专讜祝 讛 2FA 讗转专讬诐 专讘讬诐 (讜讘诪讬讜讞讚 讗转专讬 讙讜驻讬诐 爪讬讘讜专讬讬诐 讜讗转专讬 诪诪砖诇讛) 砖诪讜 诇讘 砖讗谞砖讬诐 砖诪讞讬诐 诇讛讻谞讬住 诇讗转专 拽讜讚讬诐 砖讛诐 诪拽讘诇讬诐 讘讛讜讚注讜转 住诪住, 讜诇讻谉 讛讞诇讬讟讜 诇拽讞转 讗转 讛注住拽 讛讝讛 爪注讚 拽讚讬诪讛 讜诇讜讜转专 诇讙诪专讬 注诇 讛住讬住诪讛. 诪住驻讬拽 砖讬砖 诇讛诐 讗转 诪住驻专 讛讟诇驻讜谉 砖诇讱 讜讗转 诪住驻专 转注讜讚转 讛讝讛讜转 砖诇讱, 讜讛诐 讬讻讜诇讬诐 诇讬讬爪专 诪谞讙谞讜谉 讛讝讚讛讜转 讛诪讘讜住住 注诇 转注讜讚转 讝讛讜转 讜讙讬砖讛 诇诪住驻专 讛讟诇驻讜谉. 住诪住讬诐 讞砖讜驻讬诐 诇讘注讬讜转 讛讗讘讟讞讛 讛讘讗讜转: 1. 讞讘专讜转 讛讟诇驻讜谉 诪诪砖 讙专讜注讜转 讘诇砖诪讜专 注诇 住讜讚: 讘讗诪爪注讜转 讛谞讚住讛 讞讘专转讬转 讛讗拽专讬诐 诪爪诇讬讞讬诐 诇讞讟讜祝 诪住驻专讬 讟诇驻讜谉 (谞讬讜讚 诪住驻专) 讜注讚 砖讛拽讜专讘谉 诪讘讬谉 诪讛 拽专讛 讻讘专 讞讟驻讜 诇讜 讗转 拽讜讚 讛讗讬诪讜转. 2. 讗谞讞谞讜 诪诪砖 讙专讜注讬诐 讘诇讝讛讜转 专诪讗讜讬讜转, 讜讗谞砖讬诐 专讘讬诐 诪讜住专讬诐 讗转 拽讜讚 讛讗讬诪讜转 砖讛诐 拽讬讘诇讜 诇"谞爪讬讙 砖讬专讜转" 讚诪讬讜谞讬 砖诪转拽砖专 讗诇讬讛诐 3. 诇讗 讻讜诇诐 诪拽讘诇讬诐 住诪住讬诐. 讘诪拽专讛 砖讛住诪住 诇讗 谞砖诇讞 诪谞讙谞讜谉 讛讙讬讘讜讬 讛讜讗 砖诇讬讞转 讛拽讜讚 讘讗诪爪注讜转 砖讬讞讛 拽讜诇讬转. 讗诐 讗谞讬 谞诪爪讗 讘讚讬讜拽 讘诪拽讜诐 讘诇讬 拽诇讬讟讛 讗讜转讛 砖讬讞讛 拽讜诇讬转 注诇讜诇讛 诇讛讙讬注 诇转讗 讛拽讜诇讬 砖诇讬 砖讻谞专讗讛 诇讗 讬讚注转讬 注诇 拽讬讜诪讜 讜诇讗 砖讬谞讬转讬 诇讜 诪注讜诇诐 讗转 讛住讬住诪讛. 4. 讘讙诇诇 砖讗谞讞谞讜 讗讜讛讘讬诐 诇讞讘专 讗转 讛诪讻砖讬专讬诐 讗讞讚 诇砖谞讬, 讬砖 讙讬砖讛 诪讛诪讜谉 诪拽讜诪讜转 诇讛讜讚注讜转 讛住诪住 砖诇谞讜. 诪住驻讬拽 诪讻砖讬专 讗讞讚 砖谞讙谞讘 讗讜 讗讘讚 讻讚讬 砖讛讗拽专 讬讜讻诇 诇讛砖转诪砖 讘讜 讜诇拽专讜讗 诪砖诐 讗转 讛讛讜讚注讜转. 5. 讗驻诇讬拽爪讬讜转 (讝讚讜谞讬讜转 讗讜 砖讻转讜讘讜转 专注) 注诇 讛讟诇驻讜谉 讬讻讜诇讜转 诇拽专讜讗 讗转 讛讛讜讚注讜转 讜诇讚讜讜讞 诇诪专讻讝 砖诇讬讟讛 讜讘拽专讛 讝讚讜谞讬. ## 讗讝 诪讛 注讚讬祝? 讛转砖讜讘讛 讛讻讜讗讘转 讛讬讗 砖讗诐 讗讘讟讞转 讛讞砖讘讜谉 讛讗讬砖讬 砖诇 讛诪砖转诪砖讬诐 注讜诪讚转 讘专讗砖 诪注讬讬谞讬讻诐 诇注讘讜专 诪讛讝讚讛讜转 讘讗诪爪注讜转 砖诐 讜住讬住诪讛 诇讛讝讚讛讜转 讘讗诪爪注讜转 住诪住 讝讛 讞住专 诪砖诪注讜转. 讗祝 讗讞转 诪砖转讬 讛砖讬讟讜转 诇讘讚讛 诇讗 诪住驻讬拽 讟讜讘讛 讻讚讬 诇讛讙谉 注诇 驻专讟讬诐 讗讬砖讬讬诐.

ToCode
1 419
# 诪转拽驻转 讛讻诇讬诐 诇驻注诪讬诐 (诇注转讬诐 拽专讜讘讜转 诪讚讬) 讗谞讬 诪专讙讬砖 砖讛讻诇讬诐 砖讗谞讞谞讜 讘讜讞专讬诐 驻讜注诇讬诐 讘讻讜讜谞讛 谞讙讚谞讜, 讗讜 诇驻讞讜转 砖讛讗谞砖讬诐 砖讻讜转讘讬诐 讗转 讛讻诇讬诐 讜讛转讬注讜讚 砖诇讛诐 诇讗 诇讜拽讞讬诐 讘讞砖讘讜谉 砖讬砖 诪转讻谞转讬诐 砖爪专讬讻讬诐 诇讛砖转诪砖 讜诇转讞讝拽 讗转 讛砖讟讜讬讜转 砖讛诐 讻讜转讘讬诐. 谞讬拽讞 讚讜讙诪讛 拽讟谞讛 诪驻专讜讬拽讟 next.js. 诇 next 讬砖 诪谞讙谞讜谉 砖诇 拽讜谞驻讬讙讜专爪讬讬转 讝诪谉 专讬爪讛 砖讻讘专 讘讚祝 讛转讬注讜讚 砖诇讛诐 讛诐 诪诪诇讬爪讬诐 诇讗 诇讛砖转诪砖 讘讜. 讘讻诇 讝讗转 讝讛 拽讬讬诐 讜讙诐 注诐 讚讜讙诪转 讛拽讜讚 讛讘讗讛:
import getConfig from 'next/config'
import Image from 'next/image'

// Only holds serverRuntimeConfig and publicRuntimeConfig
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig()
// Will only be available on the server-side
console.log(serverRuntimeConfig.mySecret)
// Will be available on both server-side and client-side
console.log(publicRuntimeConfig.staticFolder)

function MyImage() {
  return (
    <div>
      <Image
        src={`${publicRuntimeConfig.staticFolder}/logo.png`}
        alt="logo"
        layout="fill"
      />
    </div>
  )
}

export default MyImage
谞砖讬诐 诇讘 诇拽专讬讗讛 诇 getConfig 砖诪讜驻讬注讛 讘转讞讬诇转 讛拽讜讘抓 讜诇注讜讘讚讛 砖诪讚讜讘专 讘拽讜讘抓 拽讜诪驻讜谞谞讟讛 专讙讬诇 讻讱 砖讛爪讬驻讬讛 讛讬讗 砖讻诇 拽讜诪驻讜谞谞讟讛 砖爪专讬讻讛 讗转 讛拽讜谞驻讬讙讜专爪讬讛 转驻注讬诇 讗转 getConfig 讘转讜讱 讛拽讜讚 砖诇讛. 注讻砖讬讜 诪讛 - 讻砖讗谞讬 专讜爪讛 诇拽讞转 驻专讜讬拽讟 讻讝讛 讜诇讛注讘讬专 讗讜转讜 诇住讘讬讘转 讘讚讬拽讜转 讛拽讜讚 讻诪讜讘谉 谞讻砖诇. 讘住讘讬讘转 讛讘讚讬拽讜转 讗讬谉 诇讬 砖专转 next 专抓 讻讬 讗谞讬 专拽 专讜爪讛 诇讘讚讜拽 讗转 拽讜讚 爪讚 讛诇拽讜讞. 讝讛 诇讗 住讜祝 讛注讜诇诐 讗谞讬 讬讻讜诇 诇注讚讻谉 讗转 讛拽讜讚 讜诇讛讞诇讬祝 讗转 讛驻讜谞拽爪讬讛 讘 mock, 讜讬砖 讗驻讬诇讜 讛转讬讞住讜转 诇讝讛 讘 Issue 砖谞住讙专 讘 next 注爪诪讛, 诪诪谞讜 拽讬讘诇转讬 讗转 讛专注讬讜谉. 讗讘诇, 讜讝讜 讛谞拽讜讚讛 讛讞砖讜讘讛 诇讛讬讜诐, 注讘讜讚讛 注诇 驻专讜讬拽讟 讜讜讘 讻讘专 诪讝诪谉 诇讗 "拽砖讜专讛" 专拽 诇讟讻谞讜诇讜讙讬讛 讗讞转. 诪爪讚 讗讞讚 讻诇 讻诇讬 讞讚砖 讘驻专讜讬拽讟 诪拽诇 诇谞讜 注诇 讛讞讬讬诐 诪讻讬讜讜谉 诪住讜讬诐, 讜诪爪讚 砖谞讬 讻讻诇 砖诪讜住讬驻讬诐 讬讜转专 讻诇讬诐 讻讱 诪拽讘诇讬诐 讬讜转专 讛转谞讙砖讜讬讜转 讘讬谞讬讛诐, 讜驻讬转专讜谉 讛讛转谞讙砖讜讬讜转 注诇讜诇 诇讙讝讜诇 讗驻讬诇讜 讬讜转专 讝诪谉 诪诪讛 砖讛讬讛 诇讜拽讞 诇驻转讜专 讗转 讛讘注讬讛 讛诪拽讜专讬转 讘诇讬 讛讻诇讬 讛诪讚诇讬拽.

ToCode
1 419
注讚讻谞讜 讗转 讟讘诇转 讛讛讝诪谞讜转 讻讱 砖注诪讜讚转 category 转讻讬诇 讗转 讛注专讱 1 诇讛讝诪谞讜转 拽讟谞讜转 诪 200, 讛注专讱 2 诇讛讝诪谞讜转 讘讬谉 200 诇 500, 讛注专讱 3 诇讛讝诪谞讜转 讘住讻讜诐 讘讬谉 500 诇 1,000 讜讛注专讱 4 诇讛讝诪谞讜转 讘住讻讜诐 诪注诇 1,000. 讝讜讻专讬诐 讗转 knex.raw? 讘砖讬诇讜讘 注诐 住讬诪谉 讛讙专砖 讛讛驻讜讱 砖诇 JavaScript 讛转专讙讬诇 讛讝讛 谞驻转专 讻诪注讟 讻讜诇讜 讘 SQL:
  await knex('commande').update({
    'category': knex.raw(`
      CASE
        WHEN cache_prix_total BETWEEN 0 AND 200 THEN 1
        WHEN cache_prix_total BETWEEN 200 AND 500 THEN 2
        WHEN cache_prix_total BETWEEN 500 AND 1000 THEN 4
        WHEN cache_prix_total > 1000 THEN 4
      END
    `),
  });
## 诪砖讬诪讛 12: 讬爪讬专转 讟讘诇讛 讞讚砖讛 爪专讜 讟讘诇讛 讘砖诐 commande_category 讜讘讛 砖转讬 注诪讜讚讜转: 注诪讜讚讛 诪住驻专讬转 注诐 讛注专讱 砖诇 讛拽讟讙讜专讬讛, 讜注诪讜讚转 讟拽住讟 注诐 转讬讗讜专 讛拽讟讙讜专讬讛. 讛砖诐 砖诇 讛驻讜谞拽爪讬讛 诇讬爪讬专转 讟讘诇讛 讘 knex 讛讜讗 讻讘专 讛专讘讛 讬讜转专 讛讙讬讜谞讬 讜讛拽讜讚 诇驻讬转专讜谉 谞专讗讛 讻讱:
  await knex.schema.createTable('commande_category', function(table) {
    table.integer('category');
    table.string('description');
  });
## 诪砖讬诪讛 13: 讛讻谞住转 注专讻讬诐 讘诪讻讛 诪诇讗讜 讗转 讛讟讘诇讛 讛讞讚砖讛 讘转讬讗讜专讬 4 讛拽讟讙讜专讬讜转 砖讬爪专谞讜. 讛讻谞住讛 砖诇 4 注专讻讬诐 讛讬讗 讛讝讚诪谞讜转 诪爪讜讬谞转 诇讛讻讬专 讗转 batchInsert 砖诇 knex:
  await knex.batchInsert('commande_category', [
    { category: 1, description: '< 200' },
    { category: 2, description: 'Between 200 and 500' },
    { category: 3, description: 'Between 500 and 1000' },
    { category: 4, description: '> 1000' },
  ]);
讛讬讗 注讜砖讛 讘讚讬讜拽 诪讛 砖讗转诐 诪讚诪讬讬谞讬诐 讜讗诐 讗转诐 讬讜讚注讬诐 讬讜转专 讟讜讘 诪拽谞拽住 诪讛 讟讜讘 讘砖讘讬诇讻诐 转讜讻诇讜 诇拽讘讜注 诪讛 讬讛讬讛 讙讜讚诇 讛爪'讗谞拽 砖讬讬砖诇讞 诇讘住讬住 讛谞转讜谞讬诐 (讘专讬专转 讛诪讞讚诇 讛讬讗 1,000). ## 诪砖讬诪讛 14: 诪讞讬拽讛 诪讞拽讜 讗转 讻诇 讛讛讝诪谞讜转 讛讬砖谞讜转 讬讜转专 诪 1.2.2019, 讜注讘讜专 讻诇 讛讝诪谞讛 诪讞拽讜 讙诐 讗转 讛砖讜专讜转 讛诪转讗讬诪讜转 讘讟讘诇转 commande_ligne. 讛驻讜谞拽爪讬讛 del 讛讬讗 讛讚专讱 诇诪讞讜拽 专砖讜诪讜转. 转讞讬诇讛 谞砖转诪砖 讘 Sub Query 讻讚讬 诇诪讞讜拽 讗转 讻诇 讛讛讝诪谞讜转 诪 commande_ligne:
  await knex('commande_ligne')
    .whereIn('commande_id', function() {
      this.
      select('id').
      from('commande').
      where('date_achat', '<', knex.raw("DATE('2019-02-1')"));
    }).del();
讞砖讜讘 诇砖讬诐 诇讘 讘讘谞讬讬转 讛 whereIn 砖讛驻讜谞拽爪讬讛 诇讗 爪专讬讻讛 诇讛讞讝讬专 注专讱 讗诇讗 讘讜谞讛 讗转 讛砖讗讬诇转讛 讘讗诪爪注讜转 砖讬诪讜砖 讘讗讜讘讬拽讟 this 砖 knex 诪注讘讬专 诇讛. 诇讗讞专 诪讻谉 讗驻砖专 诇讛诪砖讬讱 讜诇诪讞讜拽 讗转 讻诇 讛讛讝诪谞讜转 诪讟讘诇转 commande:
  await knex('commande').
    where('date_achat', '<', knex.raw("DATE('2019-02-1')")).
    del();
## 诇住讬讻讜诐 讛注讘讜讚讛 注诐 knex 转讛讬讛 诪讗讜讚 谞讜讞讛 诇诪转讻谞转讬诐 砖诪讻讬专讬诐 讟讜讘 SQL 讜专讜爪讬诐 讚专讱 拽诇讛 诇讻转讜讘 砖讗讬诇转讜转 讘爪讜专讛 砖讙诐 转砖转诇讘 讬驻讛 讘转讜讱 拽讜讚 讛转讜讻谞讬转, 讙诐 转讗驻砖专 Code Reuse 讜讙诐 转讗驻砖专 讬讞住讬转 讘拽诇讜转 诇注讘讜专 诇讘住讬住 谞转讜谞讬诐 讗讞专. 拽谞拽住 诇讗 讬讙讬讚 诇讻诐 讗讬讱 诇讘谞讜转 讗转 讛拽讜讚 讜诇讻谉 谞讜讞 诇讛砖转诪砖 讘讜 讻诪注讟 讘讻诇 诪注专讻转. 讘爪讚 讛砖诇讬诇讬 讛驻讜拽讜讚 专拽 注诇 讛 SQL 讗讜诪专 砖讗讬谉 诇谞讜 驻讬谞讜拽讬诐 讻诪讜 讜讜诇讬讚爪讬讜转 讜讟讬驻讜诇 讗讜讟讜诪讟讬 讘 Associations 砖讗谞讞谞讜 讬讻讜诇讬诐 诇拽讘诇 诪 ORM-讬诐 讗诪讬转讬讬诐 讻诪讜 诇讚讜讙诪讛 Sequelize.

ToCode
1 419
  const sol5 = await knex.
    select('commande.id').
    sum('commande_ligne.prix_total as prix_total').
    select('commande.date_achat', 'client.prenom', 'client.nom').
    from('commande').
    join('commande_ligne', 'commande.id', '=', 'commande_ligne.commande_id').
    join('client', 'client.id', '=', 'commande.client_id').
    groupBy('commande.id');

  console.log(sol5);
讛讝诪谞讜转 专讬拽讜转 诇讗 讬讜驻讬注讜 讘转讜爪讗讜转 讘讙诇诇 讛讘讞讬专讛 讘 INNER JOIN (讝讜 讘专讬专转 讛诪讞讚诇). 拽谞拽住 转讜诪讱 讙诐 讘讙'讜讬谉 诪砖诪讗诇 讜诪讬诪讬谉 注诐 讛驻讜谞拽爪讬讜转 leftJoin 讜 rightJoin. ## 诪砖讬诪讛 6: 砖诪讬专转 讛诪讞讬专 讛讻讜诇诇 讛讜住讬驻讜 诇讟讘诇转 讛讛讝诪谞讜转 讗转 讛诪讞讬专 讛讻讜诇诇 砖诇 讻诇 讛讝诪谞讛 讘转讜讱 注诪讜讚转 cache_prix_total. 讛诪砖讬诪讛 讛讝讗转 讛讬讗 讛讬讞讬讚讛 砖谞转拽注转讬 注诇讬讛 诪转讜讱 讛-14 驻讛 讘驻讜住讟, 讘讙诇诇 砖讘讬讜诐 讬讜诐 讗谞讬 注讜讘讚 注诇 PostgreSQL. 诪住转讘专 砖讘驻注讜诇转 注讚讻讜谉 砖诇 MySQL 讗讬 讗驻砖专 诇讛砖转诪砖 讘讟讘诇讛 讗讜转讛 诪注讚讻谞讬诐 讘转讜讱 Sub Query. 讗讞专讬 讛专讘讛 诪砖讞拽讬诐 讛讘谞转讬 讗讬讱 诇讗专讙谉 诪讞讚砖 讗转 讛砖讗讬诇转讜转 讻讚讬 砖诇讗 谞爪讟专讱 讜讛谞讛 讛转讜爪讗讛:
  await knex('commande').
    join(
      knex('commande_ligne').
        sum('commande_ligne.prix_total as price').
        select('commande_id').
        groupBy('commande_id').
        as('commande_lignes')
    , 'commande_lignes.commande_id', 'commande.id').
    update({
      'cache_prix_total': knex.raw('CAST(commande_lignes.price AS FLOAT)'),
    });
讛砖讗讬诇转讛 讛诪转讗讬诪讛 讘 SQL 谞专讗讬转 讻讱:
UPDATE `commande` INNER join 
    (SELECT
        sum(`commande_ligne`.`prix_total`) as `price`,
        `commande_id`
     FROM `commande_ligne`
     GROUP BY `commande_id`)
     AS `commande_lignes`
     ON `commande_lignes`.`commande_id` = `commande`.`id`
     SET `cache_prix_total` = CAST(commande_lignes.price AS FLOAT)
诪讛 砖讬讜爪专 诇谞讜 讗转 讛砖讗讬诇转讛 讛驻谞讬诪讬转 讘 JOIN 讝讛 讛讛注讘专讛 砖诇 讗讜讘讬拽讟 knex 讘转讜专 驻专诪讟专 专讗砖讜谉 诇驻讜谞拽爪讬讛 join 讘诪拽讜诐 砖诐 砖诇 讟讘诇讛 (讻诪讜 砖专讗讬谞讜 讘讚讜讙诪讗讜转 拽讜讚诪讜转). 谞拽讜讚讛 诪讘诇讘诇转 讘转讞讘讬专 讛讬讗 砖讘讙讬专住转 讛 knex 讗谞讬 诪驻注讬诇 讗转 as 诪转讜讱 讛砖讗讬诇转讛 讛驻谞讬诪讬转, 讗讘诇 讘 SQL 讛讜讗 谞诪爪讗 讗讞专讬 讛住讜讙专讬讬诐. 讜讻诪讜讘谉 讛讞讘专 砖诇谞讜 knex.raw 谞诪爪讗 砖诐 讘砖讘讬诇 砖讛拽专讬讗讛 诇 CAST 转注讘讜专 讟讜讘 诇讘住讬住 讛谞转讜谞讬诐. ## 诪砖讬诪讛 7: 专讜讜讞 讞讜讚砖讬 讛爪讬讙讜 讗转 讛住讻讜诐 讛讻讜诇诇 砖诇 讛讛讝诪谞讜转 砖谞讻谞住讜 讘讻诇 讞讜讚砖. 讛驻讜谞拽爪讬讛 砖诪讬讚 拽讜驻爪转 诇专讗砖 讛讬讗 DATE_FORMAT 讜讛驻讬转专讜谉 谞专讗讛 讻讱:
  const sol7 = await knex('commande').
    select(knex.raw("DATE_FORMAT(date_achat, '%Y_%m') as date")).
    sum('cache_prix_total as total_orders').
    groupBy('date');

  console.log(sol7);
## 诪砖讬诪讛 8: 住讚专 诇驻讬 诪爪讗讜 讗转 10 讛诇拽讜讞讜转 砖讬爪专讜 讗转 讛讛讝诪谞讜转 讛讻讬 讙讚讜诇讜转 讘诪注专讻转 讜讛爪讬讙讜 讗转 诪讝讛讬 讛诇拽讜讞讜转 讜住讻讜诐 讻诇诇 讛讛讝诪谞讜转 诪讻诇 讗讞讚 诪讛诐. 诪讗讞专 讜讘讟讘诇转 讛讛讝诪谞讜转 讻讘专 讛讜住驻转讬 讗转 注诪讜讚转 cache_prix_total 谞砖讗专 专拽 诇住讻讜诐 讗转 讛注专讱 讛讝讛 诇讻诇 讛讛讝诪谞讜转 砖诇 讻诇 诇拽讜讞 讜诇讛爪讬讙 讗转 10 讛诇拽讜讞讜转 注讘讜专诐 讛转讜爪讗讛 讛讬讗 讛讙讘讜讛讛 讘讬讜转专:
  const sol8 = await knex('commande').
    select('client_id').
    sum('cache_prix_total as client_sum').
    groupBy('client_id').
    orderBy('client_sum', 'desc').
    limit(10);

  console.log(sol8);
## 诪砖讬诪讛 9: 住讻讜诐 讛讝诪谞讜转 讘讻诇 讬讜诐 讛爪讬讙讜 讗转 住讻讜诐 讛讛讝诪谞讜转 砖讛转拽讘诇 讘讻诇 讬讜诐. 讘讛谞讞讛 砖诇讗 讟注讬转讬 讘转专讙讜诐 讛砖讗诇讛 讛讝讗转 讚讜诪讛 讘爪讜专讛 诪讞砖讬讚讛 诇诪砖讬诪讛 7. 讘讻诇 诪拽专讛 讝讛 讛讬讛 讛驻讬转专讜谉 砖诇讬:
  const sol9 = await knex('commande').
    select(knex.raw("DATE_FORMAT(date_achat, '%Y_%m_%d') as date")).
    sum('cache_prix_total as total_orders').
    groupBy('date_achat');

  console.log(sol9);
## 诪砖讬诪讛 10: 讬爪讬专转 注诪讜讚讛 讞讚砖讛 讛讜住讬驻讜 注诪讜讚讛 讘砖诐 category 诪住讜讙 诪住驻专 诇讟讘诇转 讛讛讝诪谞讜转. 拽谞拽住 讻讜诇诇 诇讗 专拽 讘讜谞讛 砖讗讬诇转讜转 讗诇讗 讙诐 诪谞讙谞讜谉 诇注讚讻讜谉 讛住讻讬诪讛, 讻诇讜诪专 讬爪讬专讛 讜注讚讻讜谉 砖诇 讟讘诇讗讜转. 讘砖讘讬诇 诇讛讜住讬祝 注诪讜讚讛 讗谞讞谞讜 谞讬讙砖讬诐 诇讗讜讘讬拽讟 schema 砖诇 knex 讜诪驻注讬诇讬诐 讗转 讛驻讜谞拽爪讬讛 注诐 讛砖诐 讛诪讘诇讘诇 table:
  await knex.schema.table('commande', function(table) {
    table.integer('category');
  });
讜讝讛 拽爪转 诪讘诇讘诇 讻讬 诪爪讚 讗讞讚 讗谞讞谞讜 诇讗 诪转讗专讬诐 讗转 讻诇 诪讘谞讛 讛讟讘诇讛 讗诇讗 专拽 讗转 诪讛 砖爪专讬讱 诇砖谞讜转, 讗讘诇 讛转讞讘讬专 诪住驻讬拽 驻砖讜讟 讘砖讘讬诇 砖诇讗 谞讛讬讛 拽砖讬诐 讗讬转诐. ## 诪砖讬诪讛 11: 注讚讻讜谉 讛拽讟讙讜专讬讛 讘讛讝诪谞讜转

ToCode
1 419
const knex = require('knex')({
  client: 'mysql2',
  connection: {
    host : '127.0.0.1',
    user : 'root',
    password : 'my-secret-pw',
    database : 'myapp_test'
  }
});
讘注讜诇诐 讛讗诪讬转讬 谞专爪讛 诇砖诪讜专 讗转 讛住讬住诪讛 诪讞讜抓 诇拽讜讚 讜诇讙砖转 讗诇讬讛 讘讗诪爪注讜转 诪砖转谞讛 住讘讬讘讛. 讗转 驻拽讜讚转 讛讞讬讘讜专 诪驻注讬诇讬诐 驻注诐 讗讞转 讜讘讻诇 砖讗专 讛转讜讻谞讬转 诪砖转诪砖讬诐 讘讗讜讘讬拽讟 讛讙诇讜讘讗诇讬 knex 讻讚讬 诇讬爪讜专 砖讗讬诇转讜转 讜诇讛专讬抓 讗讜转谉 诪讜诇 讘住讬住 讛谞转讜谞讬诐 砖讘讞专转诐. 拽谞拽住 诪砖转诪砖 讘 Promises 讜诇讻谉 谞讜讞 诇注讘讜讚 讗讬转讜 讘转讞讘讬专 砖诇 async/await. 讛拽讜讚 讛讘讗 讛讜讗 诪讘谞讛 砖诇 转讜讻谞讬转 诪诇讗讛 砖诪转讞讘专转 诇讘住讬住 讛谞转讜谞讬诐 讜诪讚驻讬住讛 讗转 讻诇 讛谞转讜谞讬诐 诪讟讘诇转 client:
const knex = require('knex')({
  client: 'mysql2',
  connection: {
    host : '127.0.0.1',
    user : 'root',
    password : 'my-secret-pw',
    database : 'myapp_test'
  }
});


async function main() {
  // prints all the users details
  const users = await knex('client').select('*');
  console.log(users);

  knex.destroy();
}

main();
讛拽专讬讗讛 诇 knex.destroy 讘住讜祝 住讜讙专转 讗转 讻诇 讛讞讬讘讜专讬诐 诇讘住讬住 讛谞转讜谞讬诐 讜诪讗驻砖专转 诇转讜讻谞讬转 诇讛住转讬讬诐. 讘住注讬驻讬诐 讛讘讗讬诐 讗爪讬讙 专拽 讗转 驻拽讜讚讜转 knex 注爪诪谉 砖讗谞讬 讻讜转讘. 讘砖讘讬诇 诇讛驻注讬诇 讻诇 驻拽讜讚讛 爪专讬讱 诇讻转讜讘 讗讜转讛 讘转讜讱 驻讜拽谞爪讬讬转 讛 main 诇驻谞讬 讛 destroy. ## 诪砖讬诪讛 1: 诪讬讜专讬讗诇 诪爪讗讜 讘讟讘诇转 讛诇拽讜讞讜转 讗转 Muriel 讜讜讚讗讜 砖讛住讬住诪讛 砖诇讛 讛讬讗 test11. 讛住讬住诪讗讜转 谞砖诪专讜转 讘 SHA1 讘注诪讜讚转 password 讘讟讘诇转 讛诇拽讜讞讜转 (讜讻讘专 讛转讞诇谞讜 讘专讙诇 砖诪讗诇 讘讻诇 诪讛 砖拽砖讜专 诇讗讘讟讞转 诪讬讚注 - 谞讜 tant pis). 讘讞讝专讛 诇拽谞拽住 讛砖讗讬诇转讛 讛专讗砖讜谞讛 砖诇谞讜 转讬专讗讛 讻讱:
  const muriel = await knex('client').where({
    'prenom': 'Muriel',
    'password': knex.raw('sha1("test11")'),
  }).first();
  console.log(muriel);
讗驻砖专 诪诪砖 诇专讗讜转 讘专讗砖 讗转 讛转专讙讜诐 诇 SQL. 砖讬诪讜 诇讘 诇 knex.raw 砖谞讜注讚 讻讚讬 诇讛讙讬讚 诇 knex 砖讛注专讱 砖讗谞讞谞讜 诪注讘讬专讬诐 爪专讬讱 诇注讘讜专 讻诪讜 砖讛讜讗 诇砖讗讬诇转讛 讘诇讬 诇讛讜住讬祝 Quoting. 注讜讚 谞专讗讛 讛专讘讛 诪诪谞讜 讘讛诪砖讱 讛驻讜住讟. 讛住讬讜诐 讘 first 讙讜专诐 诇拽谞拽住 诇讛讞讝讬专 讗讜讘讬拽讟 讬讞讬讚 讜诇讗 专砖讬诪讛 讜讙诐 await 诪讗讜讚 讞砖讜讘 砖诐 讻讬 knex 诪讞讝讬专 Promise. 讛讚驻住讛 砖诇 讛转讜爪讗讛 谞专讗讬转 讻讱:
TextRow {
  id: 11,
  prenom: 'Muriel',
  nom: 'Dupuis',
  email: 'muriel@example.com',
  ville: 'Paris',
  password: '100c4e57374fc998e57164d4c0453bd3a4876a58'
}
## 诪砖讬诪讛 2: 讞讬驻讜砖 诪讜爪专讬诐 讘讛讝诪谞讜转 诪爪讗讜 讗转 讻诇 讛诪讜爪专讬诐 砖诪讜驻讬注讬诐 讘讬讜转专 诪讛讝诪谞讛 讗讞转. 讝讗转 讛砖讗讬诇转讛 砖讛讬讬转讬 讻讜转讘 讘 SQL:
select nom, count(commande_id) as commande_count from commande_ligne group by nom having commande_count > 1;
讜讛转专讙讜诐 诇拽谞拽住 讛讜讗 讻诪注讟 讗讞讚 诇讗讞讚. 讛谞讛 讛拽讜讚:
  const products = await knex('commande_ligne').
    select('nom').
    count('commande_id as commande_count').
    groupBy('nom').
    having('commande_count', '>', '1');

  console.log(products);
讛驻拽讜讚讜转 select 讜 count 诪讙讚讬专讜转 讗讬讝讛 砖讚讜转 诇讘讞讜专, groupBy 讝讛 group by 讜 having 讝讛 having. ## 诪砖讬诪讛 3: 讛讜住驻转 注诪讜讚讛 诪爪讗讜 讗转 讻诇 讛诪讜爪专讬诐 砖诪讜驻讬注讬诐 讘讬讜转专 诪讛讝诪谞讛 讗讞转, 讜讛驻注诐 讛讜住讬驻讜 诇转讜爪讗讛 注诪讜讚讛 注诐 讻诇 诪讝讛讬 讛讛讝诪谞讜转 讘讛诐 讛诪讜爪专 诪讜驻讬注. 讛驻讜谞拽爪讬讛 group_concat 砖诇 MySQL 诪讬讚 拽讜驻爪转 诇专讗砖 讜拽谞拽住 谞讜转谉 诇谞讜 诇讛砖转诪砖 讘讛 讘诇讬 诇注砖讜转 讬讜转专 诪讚讬 注谞讬讬谉 讘注讝专转 knex.raw:
  const products3 = await knex.
    select('nom').
    count('commande_id as commande_count').
    select(knex.raw('group_concat(commande_id) as commandes')).
    groupBy('nom').
    from('commande_ligne').
    having('commande_count', '>', '1');

  console.log(products3);
砖讬诪讜 诇讘 砖讛驻注诐 讘诪拽讜诐 诇讛注讘讬专 讗转 砖诐 讛讟讘诇讛 讻驻专诪讟专 诇 knex 讘转讞讬诇转 讛砖讜专讛 讘讞专转讬 诇讛注讘讬专 讗讜转讛 讻驻专诪讟专 诇驻讜谞拽爪讬讛 from. 讝讛 专拽 讘砖讘讬诇 砖讬讛讬讛 谞讜讞 诇拽专讜讗. ## 诪砖讬诪讛 4: 注讚讻讜谉 注诪讜讚讛 砖诪专讜 讗转 讛诪讞讬专 讛讻讜诇诇 砖诇 讻诇 砖讜专转 讘讛讝诪谞讛 讘注诪讜讚转 prix_total 讘讟讘诇转 commande_ligne. 讛诪讞讬专 讛讻讜诇诇 讛讜讗 讛诪讻驻诇讛 砖诇 prix_unitairequantite. 讗讝 诇拽谞拽住 讬砖 转讞讘讬专 update 诪讗讜讚 驻砖讜讟 砖诪拽讘诇 讗讜讘讬拽讟 讜谞专讗讛 讻讱:
  await knex('commande_ligne')
    .update({
      prix_total: knex.raw('prix_unitaire * quantite'),
    });
讜砖讜讘 讛砖讬诪讜砖 讘 knex.raw 讻讚讬 诇转转 诇讘住讬住 讛谞转讜谞讬诐 诇注砖讜转 讗转 讛讞讬砖讜讘. ## 诪砖讬诪讛 5: 讛爪讙转 诪讞讬专 诇讻诇 讛讝诪谞讛 注讻砖讬讜 讻砖讻转讘谞讜 讗转 讛诪讞讬专 砖诇 讻诇 砖讜专讛 讘讛讝诪谞讛 谞讜讻诇 诇讞讘专 讗转 讻诇 讛砖讜专讜转 讜诇讛爪讬讙 讗转 讛诪讞讬专 砖诇 讻诇 讛讝诪谞讛. 注诇 讛讚专讱 讛讜住讬驻讜 讘讘拽砖讛 讙诐 讗转 砖诐 讛诇拽讜讞 讜转讗专讬讱 讛拽谞讬讛. 讙'讜讬谉 诪砖诇讜砖 讟讘诇讗讜转? C'est du g芒teau:

ToCode
1 419
# 讗专讘注 注砖专讛 讚讜讙诪讗讜转 诇砖讗讬诇转讜转 SQL 讘 knex.js 诇讗讞专讜谞讛 讛转讞诇转讬 诇注讘讜讚 讬讜转专 讘 knex.js 讘住讘讬讘转 Node 讜讘讬谞转讬讬诐 诪讗讜讚 谞讛谞讛 诪讛住驻专讬讛 讜讛讬讻讜诇讜转 砖诇讛. 拽谞拽住 讛讬讗 讘注爪诐 讘讜谞讛 砖讗讬诇转讜转, 拽爪转 讚讜诪讛 诇 Sequelize, 专拽 砖讘诪拽讜诐 诪讘谞讛 砖诇 ORM 拽谞拽住 讗讬诪爪讛 讙讬砖讛 讬讜转专 驻转讜讞讛 讜讬讜转专 拽专讜讘讛 诇 SQL. 讛诐 诇讗 诪谞住讬诐 诇讛住转讬专 诪讻诐 讗转 讛注讜讘讚讛 砖讗转诐 注讜讘讚讬诐 讘 SQL, 讗诇讗 诇转转 转讞讘讬专 JavaScript 拽爪转 讬讜转专 讙诪讬砖 讘诪拽讜诐 讛转讞讘讬专 讛讟拽住讟讜讗诇讬 砖诇 SQL. 讛讛讘讚诇 讛诪专讻讝讬 讘讬谉 讙讬砖讛 讝讜 诇 ORM 讛讜讗 砖讻讗谉 讗谞讞谞讜 爪专讬讻讬诐 诇讚注转 讟讜讘 SQL 讻讚讬 诇讛爪诇讬讞 诇讻转讜讘 讗转 讛砖讗讬诇转讜转, 讜讗讬谉 拽砖专 讛讻专讞讬 讘讬谉 讛砖讗讬诇转讜转 诇诪讘谞讛 讛诪讞诇拽讜转 讘讬讬砖讜诐. 诪讬 砖讬专爪讛 讬讜讻诇 诇讘谞讜转 注讚讬讬谉 讗转 讛讬讬砖讜诐 讘讙讬砖讛 诪讜谞讞讬转 注爪诪讬诐 讗讘诇 讗转诐 转爪讟专讻讜 诇讞讘专 诇讘讚 讘讬谉 讛砖讗讬诇转讜转 诇讘讬谉 讛诪讞诇拽讜转 讘转讜讻谞讬转. 讘砖讘讬诇 诇讛讘讬谉 讗转 讛讙讬砖讛 砖诇 拽谞拽住 讟讜讘 讬讜转专 讜诇讛转专砖诐 诪讛转讞讘讬专 讛谞讛 14 讚讜讙诪讗讜转 诇砖讗讬诇转讜转 SQL 诇讗 讟专讬讜讜讬讗诇讬讜转 讘讗诪爪注讜转讜. ## 诪讘谞讛 讘住讬住 讛谞转讜谞讬诐 讗转 讘住讬住 讛谞转讜谞讬诐 讜讛砖讗诇讜转 诇拽讞转讬 诪拽讜专住 SQL 讞讬谞诪讬 砖诪爪讗转讬 讘专砖转 讘拽讬砖讜专 讛讝讛: https://sql.sh/. 诇讗 注讘专转讬 注诇 讞讜诪专讬 讛诇讬诪讜讚 讗讘诇 讛转专讙讬诇讬诐 诪爪讗讜 讞谉 讘注讬谞讬讬 讜诇讻谉 讘讞专转讬 诇讛砖转诪砖 讘讛诐 诇讚讜讙诪讗讜转 讻讗谉 讘驻讜住讟. 讗转 拽讜讘抓 讛转专讙讬诇讬诐 讛诪拽讜专讬 讬讞讚 注诐 谞转讜谞讬诐 诇讚讜讙诪讛 诇讛讜专讚讛 讗驻砖专 诇诪爪讜讗 讻讗谉: https://sql.sh/exercices-sql. 讘住讬住 讛谞转讜谞讬诐 诪讜专讻讘 诪-3 讟讘诇讗讜转 诇驻讬 讛诪讘谞讛 讛讘讗:
mysql> show tables;
+----------------------+
| Tables_in_myapp_test |
+----------------------+
| client               |
| commande             |
| commande_ligne       |
+----------------------+
3 rows in set (0.01 sec)
mysql> describe client;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int unsigned | NO   | PRI | NULL    | auto_increment |
| prenom   | varchar(255) | NO   |     | NULL    |                |
| nom      | varchar(255) | NO   |     | NULL    |                |
| email    | varchar(255) | NO   |     | NULL    |                |
| ville    | varchar(255) | NO   |     | NULL    |                |
| password | varchar(255) | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql> describe commande;
+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| id               | int unsigned | NO   | PRI | NULL    | auto_increment |
| client_id        | int unsigned | NO   |     | NULL    |                |
| date_achat       | date         | NO   |     | NULL    |                |
| reference        | varchar(255) | NO   |     | NULL    |                |
| cache_prix_total | float        | NO   |     | NULL    |                |
+------------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> describe commande_ligne;
+---------------+----------------+------+-----+---------+----------------+
| Field         | Type           | Null | Key | Default | Extra          |
+---------------+----------------+------+-----+---------+----------------+
| id            | int unsigned   | NO   | PRI | NULL    | auto_increment |
| commande_id   | int unsigned   | NO   |     | NULL    |                |
| nom           | varchar(255)   | NO   |     | NULL    |                |
| quantite      | int unsigned   | NO   |     | NULL    |                |
| prix_unitaire | float unsigned | NO   |     | NULL    |                |
| prix_total    | float unsigned | NO   |     | NULL    |                |
+---------------+----------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
讗诇 转讬讘讛诇讜 诪讛爪专驻转讬转 讛砖诪讜转 诪诪讬诇讗 讚讜诪讬诐 诇讗谞讙诇讬转 讜讗谞讬 讗转专讙诐 驻讛 诪讛 砖爪专讬讱. 诪讜讻谞讬诐? 谞爪讗 诇讚专讱. ## 讞讬讘讜专 诇讘住讬住 讛谞转讜谞讬诐 讜砖讗讬诇转讛 专讗砖讜谞讛 拽讘爪讬 讛谞转讜谞讬诐 讛讙讬注讜 讘驻讜专诪讟 砖诇 MySQL 讜诇讻谉 讝讛 讘住讬住 讛谞转讜谞讬诐 讘讜 讛砖转诪砖转讬 诇转专讙讬诇. 讘砖讘讬诇 诇讛转讞讘专 诇讘住讬住 谞转讜谞讬诐 MySQL 诪转讜讻谞讬转 node.js 讘讗诪爪注讜转 拽谞拽住 谞驻注讬诇 讗转 讛驻拽讜讚讛:

ToCode
1 419
# 驻讬讬诇 讻砖讗谞讬 诪住转讻诇 讗讞讜专讛 注诇 驻专讜讬拽讟讬诐 砖诇讬 讜砖诇 讞讘专讬诐 砖谞讻砖诇讜 讗谞讬 讬讻讜诇 诇诪驻讜转 3 住讬讘讜转 诪专讻讝讬讜转 诇讻讬砖诇讜谞讜转: 1. (讛讻讬 谞驻讜抓) 讛驻专讜讬拽讟 驻砖讜讟 诇讗 注诇讛 诇讗讜讜讬专: 讛讬讛 专注讬讜谉 讟讜讘, 诪讬砖讛讜 讛转讞讬诇 诇讻转讜讘 诪砖讛讜 讜讘住讜祝 讝讛 谞砖讗专 讘讗讬讝讜 转讬拽讬讬转 讟讬讜讟讜转 注诇 讛诪讞砖讘 讗讜 谞住讙专 讻讬 诇讗 讛爪诇讬讞讜 诇讙讬讬住 诪砖拽讬注讬诐 讗讜 讻诇 住讬驻讜专 讘住讬讙谞讜谉. 2. 诇讗 讛讬讛 拽讛诇 - 讛驻专讜讬拽讟 注诇讛 诇讗讜讜讬专 讗讘诇 讗祝 讗讞讚 诇讗 专爪讛 诇讛砖转诪砖 讘讜. 3. 讞讬诇讜拽讬 讚注讜转 讗讜诪谞讜转讬讬诐 - 讝讛 讬讻讜诇 诇讛讬讜转 专讬讘 讘讬谉 诪讬讬住讚讬诐 讗讜 讗驻讬诇讜 诪讬讬住讚 讘讜讚讚 砖诪砖谞讛 讗转 讚注转讜. 讘转讞讬诇转 讛讚专讱 讞砖讘转讬 砖讛爪诇讞讛 谞专讗讬转 讘爪讜专讛 诪住讜讬诪转, 讛讙注谞讜 诇砖诐 讜注讻砖讬讜 讝讛 讻讘专 诇讗 谞专讗讛 讻诇 讻讱 讗讟专拽讟讬讘讬. 讛讟注讜转 讘诪拽专讛 讛专讗砖讜谉 讛讬讗 诇讗 诇讛讘讬谉 谞讻讜谉 讗讬讝讛 诪砖讗讘讬诐 讬砖 诇讱 讻砖讗转讛 诪转讞讬诇 讜讻诪讛 诪砖讗讘讬诐 爪专讬讱 讘砖讘讬诇 诇住讬讬诐 讗转 讛驻专讜讬拽讟. 讟讬驻 讟讜讘 讻讚讬 诇爪诪爪诐 讻讬砖诇讜谞讜转 讻讗诇讛 讛讜讗 诇专砖讜诐 诇注爪诪讻诐 讘转讞讬诇转 讻诇 驻专讜讬拽讟 讻诪讛 讝诪谉 讜讻住祝 讗转诐 诪拽爪讬诐 注讘讜专讜 讜讻诪讛 讗转诐 讞讜砖讘讬诐 砖转爪讟专讻讜. 诇讗讟 诇讗讟 讛讛注专讻讜转 砖诇讻诐 讬转讞讬诇讜 诇讛讬讜转 讬讜转专 拽专讜讘讜转 诇诪爪讬讗讜转. 讛讟注讜转 讘诪拽专讛 讛砖谞讬 讛讬讗 讛谞讟讬讛 砖诇谞讜 诇讘谞讜转 讗转 讛诪讜爪专 诇驻谞讬 砖讗谞讞谞讜 注讜砖讬诐 砖讬注讜专讬 讘讬转 讜诪讘讬谞讬诐 注讘讜专 诪讬 讜注讘讜专 诪讛 讝讛 诪讬讜注讚. 讛讟讬驻 讻讗谉 讛讜讗 诇讛转讞讬诇 诪讛"诪讬" 讜诇注砖讜转 注讘讜讚讛 专爪讬谞讬转 讻讚讬 诇诪爪讜讗 "诪讛" 专诇讜讜谞讟讬 诇讗讜转诐 讗谞砖讬诐. 讜讛诪拽专讛 讛砖诇讬砖讬? 讗谞讬 诇讗 讘讟讜讞 讘讻诇诇 砖爪专讬讱 诇讛讙讚讬专 讗讜转讜 讘转讜专 讻讬砖诇讜谉. 讛讞讬讬诐 讛诐 专爪祝 砖诇 驻专讜讬拽讟讬诐 讜讗讜诇讬 讛讻讬讜讜谉 讛讞讚砖 砖诪爪讗转 讬讬讙诪专 讟讜讘 讬讜转专 诪讛拽讜讚诐.

ToCode
1 419
# 讬讻讜诇 讜爪专讬讱 讗谞讬 讬讻讜诇 诇讛砖转诪砖 讘 Web Sockets 讻讚讬 诇讬讬爪专 讞讜讜讬转 诪砖转诪砖 讟讜讘讛 讬讜转专 诇讙讜诇砖讬诐; 讗讘诇 拽讜讚诐 讗谞讬 爪专讬讱 诇讘谞讜转 讗转专 专讬住驻讜谞住讬讘讬 讜谞讙讬砖 讻讚讬 砖讗谞砖讬诐 讬讜讻诇讜 诇讛砖转诪砖 讘讜 诪讻诇 诪讻砖讬专. 讗谞讬 讬讻讜诇 诇讛转拽讬谉 诪注专讻转 讗讬转讜专 讞讚讬专讜转 诪转讜讞讻诪转 砖转砖诇讞 住诪住 注诇 讻诇 驻注讜诇讛 讞砖讜讚讛; 讗讘诇 拽讜讚诐 讗谞讬 爪专讬讱 诇讜讜讚讗 砖讛转拽谞转讬 驻讬讬专讜讜诇 讜讛讙讚专转讬 讗转 讛讞讜拽讬诐 讻诪讜 砖爪专讬讱. 讗谞讬 讬讻讜诇 诇讛砖拽讬注 讞讜讚砖讬诐 讘讘谞讬讬转 POC 讘-5 讟讻谞讜诇讜讙讬讜转 砖讜谞讜转 讻讚讬 诇诪爪讜讗 诪讬 讛讟讻谞讜诇讜讙讬讛 讛诪讛讬专讛 讜讛讟讜讘讛 讘讬讜转专 诇诪讜爪专 砖诇讬; 讗讘诇 拽讜讚诐 讗谞讬 爪专讬讱 诇讘谞讜转 诪讜爪专 诪转驻拽讚 讻诇砖讛讜 讻讚讬 诇讜讜讚讗 砖讘讻诇诇 讬砖 诇讝讛 砖讜拽. 讛专讘讛 驻注诪讬诐 专拽 讘讙诇诇 砖讗谞讞谞讜 讬讻讜诇讬诐 诇注砖讜转 诪砖讛讜 讗谞讞谞讜 讘讟讜讞讬诐 砖讝讛 讛讚讘专 砖注讻砖讬讜 爪专讬讱 诇注砖讜转 讜砖讘诇注讚讬讜 讗讬 讗驻砖专 诇讛转拽讚诐 (讻讬 诇讻讜诇诐 讬砖 讗转 讝讛), 讜讘讝诪谉 砖讗谞讞谞讜 注讜讘讚讬诐 注诇 讘谞讬讬转 讛驻讬转专讜谉 讛诪转讜讞讻诐 讗谞讞谞讜 砖讜讻讞讬诐 砖爪专讬讱 拽讜讚诐 讻诇 诇住讙讜专 讗转 讛 Basics 讻诪讜 砖爪专讬讱. 讗谞讬 诇讗 讬讜讚注 讗讬讱 谞专讗讬转 讟讘诇转 讛讬讻讜诇-诪讜诇-爪专讬讱 砖诇讻诐, 讛讬讗 讻诪讜讘谉 砖讜谞讛 诇讻诇 驻专讜讬拽讟, 讗讘诇 讘讻诇 诪拽专讛 讗转诐 爪专讬讻讬诐 砖转讛讬讛 诇讻诐 讗讞转.

ToCode
1 419
# 转讜讻谞讬转 转砖注转 讛砖诇讘讬诐 讘讻谞讬住讛 诇拽讜讚 拽讬讬诐 诪讝诇 讟讜讘! 讛转拽讘诇转诐 诇注讘讜讚讛 讘讞讘专转 砖拽专讻诇砖讛讜. 注讜讚 诇驻谞讬 砖拽讬讘诇转诐 讗转 讛诪讞砖讘 讻讘专 讬爪专讜 诇讻诐 诪砖转诪砖 讘讙'讬专讛 讜讛转讞讬诇讜 诇讛驻谞讜转 讗讬谞住驻讜专 讘讗讙讬诐 诇讻讬讜讜谞讻诐. 诇砖讗诇转 "讗讬驻讛 讛拽讜讚?" 诪讬砖讛讜 砖讜诇讞 诇讻诐 诇讬谞拽 诇讗讬讝讛 专讬驻讜 诇讗 诪转讜注讚, 讜讘讛爪诇讞讛. 讝讛 讛专讙注 诇拽讞转 讗讜讜讬专 讜诇讛讬讻谞住 诇驻专讜讬拽讟 诇讗讟. 讛谞讛 专砖讬诪转 讗讘谞讬 讛讚专讱 砖诇讬 讘讻谞讬住讛 诇驻专讜讬拽讟 转讜讻谞讛 讙讚讜诇 讜讞讚砖: 1. 诪砖讜讟讟 拽爪转 讘拽讘爪讬诐 诇讛讘讬谉 诪讛 讛 Stack 讛讟讻谞讜诇讜讙讬: 讘讗讬讝讛 讘住讬住 谞转讜谞讬诐 诪砖转诪砖讬诐? 诪讛 讛住驻专讬讜转 讛诪专讻讝讬讜转? 讘讗讬讝讛 讙讬专住讗讜转? 讗讬讱 讛拽讘爪讬诐 诪讞讜诇拽讬诐 诇转讬拽讬讜转 讜诪讛 讘讙讚讜诇 谞诪爪讗 讘讻诇 转讬拽讬讛? 讘拽讬爪讜专 讻诇 诪讛 砖讗驻砖专 诇讙诇讜转 专拽 诪砖讬讟讜讟 讜拽专讬讗转 拽讘爪讬 讛诪拽讜专. 2. 诪驻注讬诇 讗转 讛驻专讜讬拽讟 讗爪诇讬 注诇 讛诪讻讜谞讛. 讝讛 砖诇讘 讗专讜讱 砖讘专讜讘 讛诪注专讻讜转 讚讜专砖 讛转拽谞讜转 讜讛转讗诪讜转 砖诇 讙讬专住讗讜转. 讚讜拽专 注讜讝专 诪讗讜讚 讻讗谉. 3. 诪专讬抓 讗转 讛讘讚讬拽讜转 (讻谉 讗谞讬 讬讜讚注 讗谞讬 讗讜驻讟讬诪讬 砖讬砖 讘讚讬拽讜转 讗讜讟讜诪讟讬讜转). 4. 诪砖谞讛 诪砖讛讜 拽讟谉 砖诪爪诇讬讞 诇砖讘讜专 讘讚讬拽讛. 诪诪砖讬讱 讗转 讛诪砖讞拽 讛讝讛 讻诪讛 砖讬砖 讝诪谉 讻讚讬 诇讛讘讬谉 讗讬讝讛 讘讚讬拽讜转 拽砖讜专讜转 诇讗讬讝讛 讞诇拽讬诐 讘拽讜讚. 5. 谞讻谞住 诇诪注专讻转 讘转讜专 诪砖转诪砖 专讙讬诇 讜诪砖讞拽 注诐 讛讻驻转讜专讬诐 6. 讻讜转讘 讘讚讬拽讛 讞讚砖讛 诇 Flow 砖讙讬诇讬转讬 讻砖砖讬讞拽转讬 注诐 讛诪注专讻转 (讝讛 诇讗 诪砖谞讛 讗诐 讻讘专 拽讬讬诪转 讘讚讬拽讛 诇 Flow 讛讝讛. 诇讗 讞讬讬讘讬诐 诇注砖讜转 拽讜诪讬讟). 7. 诪讜爪讗 讗转 讛讘讗讙 砖谞专讗讛 讛讻讬 驻砖讜讟 讘讙'讬专讛 讜诪谞住讛 诇转拽谉 讗讜转讜. 转讜讱 讻讚讬 讛转讬拽讜谉 讙诐 诪讜住讬祝 讗转 讛讘讚讬拽讜转 讛诪转讗讬诪讜转. 8. 诪诪砖讬讱 讘诪砖讞拽 砖诇 诇诪爪讜讗 讜诇转拽谉 讘讗讙讬诐 转讜讱 讻讚讬 讛诪砖讱 讻转讬讘转 讘讚讬拽讜转 注讚 砖讗谞讬 诪专讙讬砖 砖讗谞讬 诪讘讬谉 诇诪讛 拽砖讜专 讻诇 讞诇拽 讘拽讜讚. 9. 诪讜爪讬讗 诪讛讙'讬专讛 讻专讟讬住 注诐 驻讬爪'专 讞讚砖 讜诪讜住讬祝 讗讜转讜 讬讞讚 注诐 讛讘讚讬拽讜转. 讘住讬讜诐 转砖注转 讛砖诇讘讬诐 诇讗 专拽 砖转诪爪讗讜 讗转 注爪诪讻诐 注诐 驻讬爪'专 专讗砖讜谉 砖讻转讘转诐, 讙诐 讛诪讘讟 砖诇讻诐 注诇 讛诪注专讻转 讬讛讬讛 讛专讘讛 讬讜转专 诪驻讜拽住 讜转讜讻诇讜 诇讛诪砖讬讱 诇诪砖讬诪讜转 讛讻讘讚讜转: Refactoring 讜砖讬驻讜专讬 讘讬爪讜注讬诐.

ToCode
1 419
# 拽讜诪驻讜谞谞讟讛 诪砖讜诇砖转 讛谞讛 讘讗讙 诪注谞讬讬谉 砖砖诇讞 诇讬 转诇诪讬讚 讘专讬讗拽讟 讛讝讻讬专 诇讬 讻诪讛 讚讘专讬诐 诇讙讘讬 讗专讻讬讟拽讟讜专转 转讜讻谞讛 讘转讜讱 讛注讜诇诐 讛诪讜讝专 讛讝讛 砖诇 驻专讬讬诪讜讜专拽讬诐 讜拽讜谞驻讜谞谞讟讜转. 讗谞讞谞讜 讬讜讚注讬诐 砖讗驻砖专 诇讻转讜讘 拽讜讚 讻讝讛 讘专讬讗拽讟:
function MyTripleComponent(props) {
  const { text } = props;

  if (text === 1) {
    return <p>Hello</p>;
  } else if (text === 2) {
    return <p>Bye bye</p>;
  } else {
    return <p>I don't understand</p>;
  }
}
讛拽讜诪驻讜谞谞讟讛 诪拽讘诇转 诪讗驻讬讬谉 诪住驻专讬 讜诇驻讬 讛注专讱 砖诇讜 诪讞诇讬讟讛 讗讬讝讛 讟拽住讟 诇讛爪讬讙. 讝讛 注讜讘讚, 拽诇 诇讛讘谞讛 讜砖讙讜讬 (讗讜 诇驻讞讜转 诪讜讘讬诇 讘住讘讬专讜转 讙讘讜讛讛 诇讘讗讙讬诐 诪讜讝专讬诐 讘讛诪砖讱). 讘诪砖讞拽 砖诇 讗专讻讬讟拽讟讜专讛 讗转讛 拽讜讚诐 讻诇 爪专讬讱 诇砖讞拽 诇驻讬 讛讻诇诇讬诐 砖诇 讛驻专讬讬诪讜讜专拽. 诇讗 专拽 讛讻诇诇讬诐 讛拽砖讬讞讬诐 讗诇讗 讙诐 转驻讬住转 讛注讜诇诐 - 讜讝讛 讛讞诇拽 讛拽砖讛. 讘专讬讗拽讟 拽讜诪驻讜谞谞讟讛 讻诪讜 砖讻转讘谞讜 讛讬讗 诇诪注砖讛 砖诇讜砖 拽讜诪驻讜谞谞讟讜转 砖诪讞讜讘专讜转 讘讬谞讬讛谉 讘讚讘拽 诇讗 讬讜转专 诪讚讬 讞讝拽. 砖讬谞讜讬 拽讟谉 讘讚专讬砖讛 讬诪讬住 讗转 讛讚讘拽 讜讬砖诇讞 讗讜转谞讜 诇砖讜讟讟 讘诪讚讘专 讛讘讗讙讬诐. 讛谞讛 讻讘专 拽讜讚 砖诪转讞讬诇 诇讛讬讜转 诪住讜讻谉:
function MyTripleComponent(props) {
  const { type } = props;

  if (type === 1) {
    const [text, setText] = React.useState("");

    return (
      <label>
        <input
          type="text"
          value={text}
          onChange={(e) => setText(e.target.value)}
        />
        {text}
      </label>
    );
  } else if (type === 2) {
    return <p>Bye bye</p>;
  } else {
    return <p>I don't understand</p>;
  }
}
讛驻注诐 讘讗讞讚 讛注谞驻讬诐 讗谞讬 爪专讬讱 讙诐 诇砖诪讜专 住讟讬讬讟 讜讛住讟讬讬讟 讛讝讛 诇讗 专诇讜讜谞讟讬 诇注谞驻讬诐 讛讗讞专讬诐. 讗诐 转讘注讟讜 拽爪转 讘拽讜诪驻讜谞谞讟讛 讛讝讜 讘住讜祝 转讙讬注讜 诇讛讜讚注转 讛砖讙讬讗讛 讛讘讗讛:
Rendered more hooks than during the previous render.
讛驻讬转专讜谉 讘诪爪讘 讻讝讛 诇讗 讬讛讬讛 诇诪砖讜讱 讗转 讛拽专讬讗讛 诇 useState 诇专讗砖 讛驻讜谞拽爪讬讛, 讗诇讗 诇讛驻专讬讚 讗转 讛驻讜谞拽爪讬讛 诇-3 拽讜诪驻讜谞谞讟讜转 砖讜谞讜转. 讝讛 讛讗讜驻谉 讘讜 讛讬讗 讛讬转讛 爪专讬讻讛 诇讛讬讻转讘 诪讛讛转讞诇讛.