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