javascript - typescript kan inte hitta moduler till bcrypt om .ts-fil ligger djupare i mappen


Den enkla fungerande koden i projektets rotmapp (kallad här systemname):

import * as bcrypt from 'bcrypt'; 

let myvalue = "JFDSNJDSNFJSDNFSJASASNDCAUDHANDKLAMDXIALWDMQAW";

bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash(myvalue, salt, function(err, hash) {
        console.log(myvalue);
        console.log(hash);
        console.log(bcrypt.compareSync(myvalue,hash));
    });
});

let salt = bcrypt.genSaltSync(10);
let hash = bcrypt.hashSync(myvalue,salt);
console.log(myvalue);
console.log(hash);
console.log(bcrypt.compareSync(myvalue,hash));

Följande kod är nästan samma som ovan men går sönder endast för klassen stuff och genom att vara djupt inne i mappstrukturen som systemname/T/cryptUtil.ts. Koden är följande:

import * as bcrypt from "bcrypt";

export class cryptUtil {
  //-------------------------------------------------
  private _rounds: number = 10;  //0xf49f6cd693d04c7ebe6928429a24f2ce;
  public get rounds(): number {
    return this._rounds;
  }
  public set rounds(rounds: number) {
    this._rounds = rounds;
  }
  //-------------------------------------------------
  public getSalt(): string {
    return bcrypt.genSaltSync(this.rounds);
  }
  //-------------------------------------------------
  public getSaltAsynchronous(
    callback: ((err: Error, salt: string) => void)
  ): void {
    bcrypt.genSalt(this.rounds, callback);
  }
  //-------------------------------------------------
  public BCryptHashGet(passw: string): string {
    return bcrypt.hashSync(passw, this.getSalt());
  }
  //-------------------------------------------------
  public BCryptHashGetAsynchronous(
    passw: string,
    callback: ((err: Error, hash: string) => void)
  ): void {
    this.getSaltAsynchronous((err: Error, salt: string) => {
      bcrypt.hash(passw, salt, callback);
    });
  }
  //-------------------------------------------------
  public BCryptHashCompare(passw: string, hash: string): boolean {
    return bcrypt.compareSync(passw, hash);
  }
  //-------------------------------------------------
  public BCryptHashCompareAsynchronous(
    passw: string,
    hash: string,
    callback: ((err: Error, isMatch: boolean) => void)
  ): void {
    bcrypt.compare(passw, hash, callback);
  }
  //-------------------------------------------------
}

Ett annat sätt att inte få varningar eller fel är att flytta klassen till projektets rotmapp (här kallad systemname) och skapa en fil även i rotmappen för att testa enligt följande:

Filen med klassen flyttad till rotmappen:

import * as bcrypt from "bcrypt";

export class lxCryptUtil {
  //-------------------------------------------------
  lxGetSalt(rounds: number): string {
    return bcrypt.genSaltSync(rounds);
  }
  //-------------------------------------------------
  lxGetSaltAsynchronous(
    rounds: number,
    callback: ((err: Error, salt: string) => void)
  ): void {
    bcrypt.genSalt(rounds, callback);
  }
  //-------------------------------------------------
  lxBCryptHashGet(rounds: number, passw: string): string {
    return bcrypt.hashSync(passw, this.lxGetSalt(rounds));
  }
  //-------------------------------------------------
  lxBCryptHashGetAsynchronous(
    rounds: number,
    passw: string,
    callback: ((err: Error, hash: string) => void)
  ): void {
      this.lxGetSaltAsynchronous(rounds, (err: Error, salt: string) => {
      bcrypt.hash(passw, salt, callback);
    });
  }
  //-------------------------------------------------
  lxBCryptHashCompare(passw: string, hash: string): boolean {
    return bcrypt.compareSync(passw, hash);
  }
  //-------------------------------------------------
  lxBCryptHashCompareAsynchronous(
    passw: string,
    hash: string,
    callback: ((err: Error, isMatch: boolean) => void)
  ): void {
    bcrypt.compare(passw, hash, callback);
  }
  //-------------------------------------------------
}

Filen skapad för att testa klassen flyttades till rotmappen:

import { lxCryptUtil } from './lxCryptUtil';

export class dummy{
    processPwd(): void {
        let hash: string = "";
        let passwd: string = "FJIEJWIOEFNWONMWLEW";
        let lx = new lxCryptUtil();
        hash = lx.lxBCryptHashGet(10,passwd);
        console.log(passwd);
        console.log(hash);
        console.log(lx.lxBCryptHashCompare(passwd, hash));
    }
}

let d = new dummy();
d.processPwd();

Om man kodar det mest grundläggande möjliga i en .ts-fil i projektets rotmapp finns det inga fel med @types/bcrypt, men om man lägger .ts lite djupare och organiserar det inne i en klass, får man fel.

När du gör:

npm run build | grep "Can't resolve"

återstod endast följande fel:

Module not found: Error: Can't resolve 'npm' in '/systemname/node_modules/node-pre-gyp/lib/util'
Module not found: Error: Can't resolve '../package' in '/home/myuser/node_modules/node-gyp/lib'
Module not found: Error: Can't resolve 'aws-sdk' in '/systemname/node_modules/node-pre-gyp/lib'
Module not found: Error: Can't resolve 'aws-sdk' in '/systemname/node_modules/node-pre-gyp/lib'
Module not found: Error: Can't resolve 'aws-sdk' in '/systemname/node_modules/node-pre-gyp/lib'
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! [email  build: `webpack`
npm ERR! Exit status 2
npm ERR!
npm ERR! Failed at the [email  build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/myuser/.npm/_logs/2018-01-18T01_01_01_012Z-debug.log

Innan man hittade denna lösning fanns det många andra fel.

Men kan inte hålla varje klass i rätt mapp för att inkludera där jag vill.
Det finns detaljer och aktuell status här.

Svar #1

Som besvarat av @agathver här: https://github.com/kelektiv/node.bcrypt.js

NodeJS inbyggda moduler innehåller DLL-filer och limkod och modulens initialiseringskod laddar dem i NodeJS-processen. För detta behöver vi den fullständiga sökvägen till den inbyggda modulen. Vi använder ett bibliotek som kallas bindings för att hitta den korrekta sökvägen till den inbyggda DLL-filen.

Webpack ändrar dessa förväntningar under bundling (nämligen att initialiseringskoden och package.json ligger i katalogen)

bcrypt kan inte paketeras

Relaterade artiklar