我试图在nextjs中使用bcrypt将管理员密码散列保存到数据库中,但收到错误



因此,如果我不导入bcrypt,一切都很好,但一旦导入,我就会在终端中收到以下错误。我找了很多东西,但都没有运气。我不知道该怎么办。任何帮助都将不胜感激。

error - ./node_modules/@mapbox/node-pre-gyp/lib/clean.js:8:0
Module not found: Can't resolve 'fs'
Import trace for requested module:
./node_modules/@mapbox/node-pre-gyp/lib/ sync ^./.*$
./node_modules/@mapbox/node-pre-gyp/lib/node-pre-gyp.js
./node_modules/bcrypt/bcrypt.js
./pages/adminlogin.js
https://nextjs.org/docs/messages/module-not-found

这是我的adminlogin.js文件

import bcrypt from "bcrypt";
export default function AdminLogin() {
const saltRounds = 10;
const createAdminData = async (e) => {
const usernameInfo = e.target.username.value;
console.log(usernameInfo);
const passwordInfo = e.target.password.value;
const salt = bcrypt.genSalt(saltRounds);
const hashedPassword = bcrypt.hash(passwordInfo, salt);
const res = await fetch("api/database/addadmindata", {
method: "POST",
headers: {
"Content-type": "application/json",
},
body: JSON.stringify({
username: usernameInfo,
password: hashedPassword,
}),
});
const result = await res.json();
router.reload();
};

发生此错误是因为在应用程序的客户端某个位置您正在使用fs模块。您只能在服务器端使用fs模块,getserverSideProps或api目录。

当您导入";fs";并在服务器端使用它,next.js将看到您在服务器端中使用它,这样它就不会将该导入添加到客户端捆绑包中

可能@mapbox不是客户端库,但您正在客户端中使用它

你可能有猫鼬userSchema。在该模式文件中:

// hashing password before saving user
// for findAndUpdate(), pre save hook is not triggered
userSchema.pre("save", async function (next) {
// if password did not get changed, next()
if (!this.isModified("password")) {
next();
}
this.password = await bcrypt.hash(this.password, 10);
});

现在您不需要在服务器上进行哈希运算。从req.body中提取数据,用原始密码约定user,然后运行

等待user.save((

所以在";用户";保存时,原始密码将自动散列,散列后的密码将保存到数据库

最新更新