Koa + TypeScript: თვისება 'body' არ არსებობს Request ტიპზე
მინდოდა გამოვიყენო koa & koa-bodyparser TypeScript-თან ერთად, მაგრამ როცა კი ვწვები ctx.request.body, მეღება შეცდომა, რომ body არ არსებობს ტიპზე Request
import Koa from 'koa'
import Router from 'koa-router'
import bodyparser from 'koa-bodyparser'
const app = new Koa()
const router = new Router()
const data = ['lorem', 'ipsum', 'dolor', 'sit', 'amet']
app.use(bodyparser())
router.post('/', (ctx, next) => {
const phrase = ctx.request.body; // Property 'body' does not exist on type Request
if (typeof phrase === 'string') {
ctx.response.body = data.filter(element => element.includes(phrase))
}
})
პასუხი #1
გააკეთეთ npm install --save-dev @types/koa-bodyparser ტერმინალში იმ დირექტორიაში, სადაც მდებარეობს თქვენი package.json
ეს პაკეტი შეიცავს ტიპებს, რომლებიც შემოიღო koa-bodyparser-მა (მაგალითად, request.body)
პასუხი #2
თუ მომავლიდან ხართ აქ, არსებობს დამატებითი პრობლემა, რაც ამას გამოიწვევს. სცენარი:
- წარსული შენ: დაინსტალირე koa, koa-bodyparser, @types/koa, @types/koa-bodyparser
- კოდი: ყველაფერი კარგად მუშაობს
- დღეს თქვენ: დროა განახლებისთვის; განახლება [ყველა ამ პაკეტისთვის]
- კოდი:
საკუთრება 'body' არ არსებობს ტიპზე Request
მოკლედ: yarn.lock, ამიტომ გაშვით yarn dedupe @types/koa.
რა მოხდა?
გაღრმავებით, თქვენს node_modules-ში ხედავთ:
- node_modules/
- @types/koa/
- @types/koa-bodyparser/
- node_modules/
- @types/koa/
რატომ არის ეს განცხადებითი?
მოდი გადავხედოთ @koa-bodyparser-ს, რომ გავიგოთ. აი შესაბამისი ხაზები და როგორ მუშაობს ის:
import * as Koa from "koa";
declare module "koa" {
interface Request {
body?: any;
rawBody: string;
}
}
ეს რასაც აკეთებს, არის დამატებითი პარამეტრების განსაზღვრა Request ტიპისთვის koa პაკეტში, რომელსაც თქვენ იყენებთ, მართალია? ჩვეულებრივ, მაგრამ არა სულაც. მას ასევე აქვს დამოკიდებულება @types/koa-ზე, იმიტომ რომ აქვს import ზედა ნაწილში. სინამდვილეში, ეს რასაც აკეთებს არის დამატებითი პარამეტრების განსაზღვრა Request ტიპისთვის იმ koa ობიექტზე, რომლის გამოყენებაც მას უნდა, და რადგან ახლა იყენებს განსხვავებულ ვერსიას თქვენგან, თქვენ ეს უპირატესობა აღარ გაქვთ.
კარგი, მაშინ რატომ მოხდა ეს ქმნა?
როდესაც თქვენ პირველად დააყენეთ ყველაფერი, yarn შექმნა დამოკიდებულებათა ხე, გადახედა თითოეულ package.json-ში ვერსიებს და საბოლოოდ მიიღო ეს:
"@types/koa@*", "@types/koa@^2.13.1":
version "2.13.1"
... resolved, integrity, dependencies, etc.
@types/koa@^2.13.1 იქნება ნებისმიერი ვერსია, რომელიც დაინსტალირეთ თქვენს package.json-ში. @types/koa@* არის ის, რაც არის @types/koa-bodyparser-ში.
და შემდეგ, როდესაც განახლდით, yarn-მა შექმნა დამოკიდებულებების ხე, შეხედა ვერსიებს თითოეულ package.json-ში და შეადარა ეს იმას, რაც უკვე ჰქონდა. თქვენი კოდი ახლა ამბობს @types/koa@^2.13.5, ამიტომ yarn-ს სჭირდება მისი ახალი ვერსიის ინსტალაცია. @types/bodyparser ჯერ კიდევ ამბობს @types/koa@*, რაც უკვე გათვალისწინებულია yarn.lock-ში, და ასე მიიღებთ yarn.lock-ს, რომელიც ასე გამოიყურება:
"@types/koa@*":
version "2.13.1"
... resolved, integrity, dependencies, etc.
"@types/koa@^2.13.5":
version "2.13.5"
... resolved, integrity, dependencies, etc.
ახლა, როდესაც თქვენ აღარ იყენებთ ერთსა და იმავე ვერსიას, ერთი დაინსტალერება თქვენს node_modules-ში, ხოლო მეორე დაინსტალერება იმ პაკეტის node_modules-ში, რომელმაც ის მოითხოვა.
აბა, როგორ უნდა ვასწორო ეს?
განახლებულია 2024 წლისთვის
თქვენ მხოლოდ ის ერთიანი პაკეტი უნდა დაარედუქციოთ. გაუშვით ეს, რომ უთხრათ yarn-ს ყველაფრის განახლება არასაშფოთებელ დიაპაზონში (ოღონდ იგივე შედეგი, როგორც „წინა პასუხი“, ჭურვის ფაილის ხელით ცვლილების გარეშე).
yarn dedupe @types/koa
თუ გსურთ ნახოთ, რა სხვა პრობლემებს შეიძლება შეხვდეთ მომავალში, შეგიძლიათ ეს გამოაგონოთ შემოწმებისთვის (ფრთხილი გაშვება) ყველა პაკეტისთვის. გახსოვდეთ: არასაჭირო კოპიების არსებობა ნიშნავს უფრო დიდ ინსტალაციის დროს დეველოპერებისთვის და Deployment-ის უფრო დიდ დროს.
yarn dedupe --check
მაშინ, თუ მოგწონთ, შეგიძლიათ ან გარბოდეთ
yarn dedupe- დოკუმენტაციის მიხედვით, ეს უზრუნველყოფს, რომ გაქვთ პაკეტის ყველაზე ცოტა რაოდენობის კოპიები, როდესაც ვერსიები იკვეთება, რაც შეიძლება რამდენიმე დეგრადაცია გამოიწვიოს, თუ ერთი ბიბლიოთეკა ითხოვს დაბალ ვერსიას.
- რადგან პირველ რიგში ვერსიების გადაკვეთას უნდა ესებოდეს, ეს ცოტათი უფრო ნელია, მაგრამ საბოლოოდ იწვევს ნაკლებ ფაილს.
yarn dedupe --strategy highest- დოკუმენტაციის მიხედვით, ეს უზრუნველჰყოფს, რომ პაკეტები ყოველთვის გამოიყენებენ მხარდამჭერ უახლეს ვერსიას, თითქოს ახლიდან დაინსტალირებდით. თუ ერთი პაკეტი მოითხოვს დაბალ ვერსიას და სხვა არა, საბოლოოდ გაქვს რამდენიმე ასლი, მაგრამ კოდი, რომელიც შეზღუდული არ არის, მიიღებს უახლეს ვერსიას, რომელსაც იგი მხარს უჭერს.
- რადგან ეს უბრალოდ იყენებს ყველაზე მაღალ მხარდაჭერილს, იგი უფრო სწრაფია (შეიძლება ერთი გადავლით მოახდინოს), მაგრამ ხშირად იწვევს დუბლიკატებს.
- მიმდინარე კითხვასთან მიმართებაში, ჩამჯდარი პაკეტი ესაჭიროება
*. თუ თქვენი კოდი საჭიროებს მთავარ ვერსიას, რომელიც ნაკლებიაlatest-ზე, შესაძლოა პრობლემა არ გამოსწორდეს. ეს იშვიათია, მაგრამ თუ აქამდე მოხვედით, სავარაუდოდ გინდათ გახსოვდეთ, რომ ეს შესაძლებელია.
შენიშვნა 1: გაიხსენეთ, რომ არა ყველა პაკეტი სემვერს (semver) მიჰყვება, ასე რომ მაინც გჭირდებათ სიფრთხილე, რომ ეს ერთიანად ყველა პაკეტში არ გააკეთოთ --check-ის გარეშე და არ შეამოწმოთ, რომ ამ ცვლილებებთან დამატებითი პრობლემა არ გაქვთ.
შენიშვნა 2: თუ იყენებთ Yarn 1-ს, dedupe ჯერ არ არის ჩაშენებული, ამიტომ მე დავაყენებდი yarn-deduplicate-ს და შემდეგ ავმართავდი yarn-deduplicate --packages @types/koa.
წინა პასუხი
ყველაზე მარტივი გზა? წაშალეთ მთელი ბლოკი @types/koa@* თქვენი yarn.lock ფაილიდან და კვლავ გაიარეთ yarn. ახლა თქვენ მიიღებთ ამას:
"@types/koa@*", "@types/koa@^2.13.5":
version "2.13.5"
... resolved, integrity, dependencies, etc.
და ყველაფერი ისევ ბედნიერია შემდეგ დრომდე.
