node.js - استفاده از متغیر ENV در داخل jwt sign
من در سیستم خود از JWT استفاده میکنم و تقریباً به خوبی کار میکند، که من برای SecretKey خود از یک رشته معمولی استفاده میکنم، در اینجا کد کاری آورده شده است
export class CompanyResolver {
@Query(() => [Company])
companies() {
return Company.find();
}
@Query(() => Company)
async login(
@Arg("email") email: string,
@Arg("password") password: string,
): Promise<Company | null> {
const company = await Company.findOne({ where: { email } });
if (!company)
throw new Error("Company Not Found!!!");
if (!await bcrypt.compare(password, company.password))
throw new Error("Incorrect Password!!!");
const secret=process.env.JWT_SECRET;
console.log(secret)
company.accessToken = jsonwebtoken.sign({ company }, "12345", {
expiresIn: "30 days"
})
return company;
}
من راز خود را در فایل env تعریف کردهام که با انجام console.log(process.env.JWT_SECRET) کلید خود را به من باز میگرداند که این به این معنی است که مشکلی در آن وجود ندارد، اما مشکل زمانی است که سعی میکنم از آن استفاده کنم
company.accessToken = jsonwebtoken.sign({ company }, secret, {
expiresIn: "30 days"
})
من میگیرم
Type 'undefined' is not assignable to type 'Secret'.
من تازهکار در nodejs و TS هستم، پیشاپیش بابت هر اشتباه کودکانهای عذرخواهی میکنم، آیا کسی میتواند مشکل را نشان دهد؟
پاسخ شماره ۱
نوع مقدار process.env، string | undefined است. این بدان معناست که تایپاسکریپت تضمین نمیکند که برای هر process.env.MY_ENV_VAR حتماً یک نوع رشته برگردانده شود. ممکن است undefined بازگردانده شود اگر متغیر محیطی تنظیم نشده باشد، بنابراین احتیاط کنید.
در این صورت، چیزی شبیه به این باید کمک کند
if(secret){
company.accessToken = jsonwebtoken.sign({ company }, secret, {
expiresIn: "30 days"
})
} else {
// Handle the case where the variable is not set, may be throw exception
}
پاسخ شماره ۲
شما همچنین میتوانید از تأکید بر تخصیص قطعی استفاده کنید تا تایپاسکریپت را مطلع سازید که «secret» حتماً موجود است، با استفاده از یک '!'. همانطور که پاسخ بالا ذکر میکند، process.env از نوع string | undefined است، که نوع نامعتبری برای jwt.Secret میباشد.
company.accessToken = jsonwebtoken.sign({ company }, secret!, {
expiresIn: "30 days"
})
