Загрузка...

TypeScript import problem

Thread in Node.js created by RichPerson Dec 21, 2023. 208 views

  1. RichPerson
    RichPerson Topic starter Dec 21, 2023 Разработка - https://zelenka.guru/threads/4480553/ 2160 Sep 23, 2019
    Делал проект, ни одной проблемы и тут блять оно не принимает один единственный импорт, который не отличается от других блять ничем
    [IMG]
    Ошибка при отладке показывает:
    config: Config = new Config()
    Uncaught ReferenceError ReferenceError: Config is not defined at <anonymous> (repl:1:9)

    import { Config } from "../../config"
    Uncaught SyntaxError SyntaxError: Cannot use import statement outside a module at (program) (repl:1:1)

    Файл в котором происходит импорт

    JS
    import { NextFunction, Request, Response } from "express"
    import { body } from "express-validator"
    import bcrypt from 'bcrypt'
    import jwt from 'jsonwebtoken'
    import { getUser } from "../../models/User"
    import { Config } from "../../config"

    export class Middleware{
    static _instance: Middleware

    config: Config = new Config()

    public constructor(){
    if(!Middleware._instance){
    Middleware._instance = this
    }

    this.config = new Config()

    return Middleware._instance
    }

    public removeToken(req: Request, res: Response, next: NextFunction){
    if(req.headers.authorization){
    res.removeHeader('Authorization')
    next()
    }
    else{
    next()
    }
    }

    public checkAuth(req: Request, res: Response, next: NextFunction){
    console.log(this.config.key.secretKey)
    if(req.headers.authorization){
    const decodeToken = jwt.verify(req.headers.authorization, this.config.key.secretKey)
    //getUser(decodeToken)
    return next()
    }
    else{
    res.json({msg:"as"})
    //return res.redirect('/login')
    }
    }

    public validateUsername(){
    return body('username').notEmpty().isLength({min: 6, max: 18}).escape()
    }

    public validatePass(){
    return body('password').notEmpty().isLength({min: 8, max: 32}).escape()
    }

    public async cryptPass(password: string){
    return bcrypt.hashSync(password, this.config.key.salt)
    }

    public async generateAccessToken(username: string, role: string, id: number){
    const payload = {
    username,
    role,
    id
    }
    return jwt.sign(payload, this.config.key.secretKey, {expiresIn: '30d'})
    }

    public async validateUser(password: string, pass_hash: string){
    return bcrypt.compareSync(password, pass_hash)
    }
    }
    Файл из которого импортируем

    JS
    import fs from "fs"

    interface IConfig {
    telegram: {
    api_id: number,
    api_hash: string
    }
    db: {
    name: string,
    user: string,
    pass: string,
    host: string
    }
    key: {
    secretKey: string,
    salt: number
    }
    }

    export class Config implements IConfig {
    telegram = {
    api_id: 0,
    api_hash: ""
    }
    db = {
    name: '',
    user: '',
    pass: '',
    host: ''
    }
    key = {
    secretKey: '',
    salt: 0
    }

    static _instance?: Config

    constructor() {
    if (!Config._instance) {
    Config._instance = this
    }

    const db = fs.readFileSync('./config/db.json', 'utf-8')
    const key = fs.readFileSync('./config/key.json', 'utf-8')

    this.db = JSON.parse(db)
    this.key = JSON.parse(key)

    this._load()

    return Config._instance
    }

    _load() {

    }
    }
    Очень надеюсь на помощь, нервов уже не хватает
     
    1. жди
    2. View the next comments (1)
  2. ChatGPT
    ChatGPT Dec 21, 2023 2250 Mar 14, 2023
    RichPerson, кажется, проблема возникает из-за того, что вы пытаетесь использовать класс `Config` до его импорта. В файле `Middleware.ts` вы создаете экземпляр класса `Config` до того, как импортируете его из файла `config.ts`. Попробуйте изменить порядок импорта, чтобы сначала импортировать `Config`, а затем использовать его в `Middleware.ts`. Вот пример исправленного кода:

    TYPESCRIPT

    import { NextFunction, Request, Response } from "express"
    import { body } from "express-validator"
    import bcrypt from 'bcrypt'
    import jwt from 'jsonwebtoken'
    import { getUser } from "../../models/User"
    import { Config } from "../../config"

    export class Middleware {
    static _instance: Middleware

    config: Config = new Config()

    public constructor() {
    if (!Middleware._instance) {
    Middleware._instance = this
    }

    this.config = new Config()

    return Middleware._instance
    }

    // остальной код...
    }
    Попробуйте внести эту правку и проверьте, решает ли она проблему с импортом класса `Config`. Если проблема остается, дайте мне знать, чтобы мы могли исследовать ее дальше.
     
    1. View previous comments (1)
    2. ChatGPT
      RichPerson, ошибка "Cannot use import statement outside a module" обычно возникает, когда вы пытаетесь использовать оператор `import` в файле, который не является модулем. Это может произойти, если ваш файл не имеет расширения `.js` или `.mjs`, или если вы не указали атрибут `type="module"` в теге `<script>` при использовании в браузере.

      В вашем случае, вы используете `import` в файле `Middleware.ts`. Убедитесь, что ваш проект настроен для использования модулей. В Node.js вы можете указать, что файл является модулем, добавив расширение `.mjs` к имени файла (например, `Middleware.mjs`). Затем вы можете использовать `import` в этом файле.

      Если вы используете браузер, убедитесь, что в вашем теге `<script>` есть атрибут `type="module"`:

      HTML

      <script type="module" src="main.js"></script>
      Если вы все еще получаете ошибку, убедитесь, что пути к файлам указаны правильно. Проверьте, что файл `Config.ts` действительно находится по пути `../../config` относительно файла `Middleware.ts`.

      Если ни одно из этих решений не помогло, пожалуйста, предоставьте больше информации о вашем проекте и его структуре, чтобы я мог предложить более точное решение.
    3. RichPerson Topic starter
      ChatGPT, Uncaught Error Error: Cannot find module '../../config'Require stack:- <inspector console> at Module._resolveFilename (internal/modules/cjs/loader:1077:15) at Module._load (internal/modules/cjs/loader:922:27) at Module.require (internal/modules/cjs/loader:1143:19) at require (internal/modules/cjs/helpers:121:18) at <anonymous> (repl:1:18)

      Такая ошибка в скомпилированном js файле
      Путь указан правильно
    4. ChatGPT
      RichPerson, ошибка "Cannot find module '../../config'" указывает на то, что Node.js не может найти модуль `../../config`. Возможные причины этой ошибки:

      1. Убедитесь, что файл `Config.ts` или `Config.js` действительно существует по указанному пути `../../config`. Проверьте правильность написания имени файла и его расширения.

      2. Проверьте, что путь `../../config` указан правильно относительно файла `Middleware.ts`. Убедитесь, что вы правильно указали количество `../` для перехода на уровень выше и попадания в папку `config`.

      3. Если вы используете TypeScript, убедитесь, что файл `Config.ts` правильно скомпилирован в JavaScript. Проверьте настройки компиляции TypeScript, чтобы убедиться, что файл `Config.ts` включен в процесс компиляции и правильно скомпилирован в JavaScript.

      4. Если вы используете модули CommonJS (`require` и `module.exports`), убедитесь, что вы правильно используете `require` для импорта модуля `Config`. Например, вместо `import { Config } from "../../config"` используйте `const { Config } = require("../../config")`.

      Если ни одно из этих решений не помогло, пожалуйста, предоставьте больше информации о структуре вашего проекта и коде, чтобы я мог предложить более точное решение.
  3. equilpres
    equilpres Dec 25, 2023 :smile_wink: 13,309 Aug 11, 2020
    RichPerson, Если у тебя прописан type: module в файле package.json, то при импорте модули должны иметь расширение, например:
    JS
    import { Config } from "../../config.js";
    Независимо от того, используешь ли ты TypeScript или нет.
     
    1. View previous comments (3)
    2. RichPerson Topic starter
      equilpres, спасибо бро, уже решил проблему, убрал некоторые детали просто с вызовом класса и все. Даже костыли не пришлось всовывать. Но тема полезная, пробежался глазами
Loading...
Top