【问题标题】:UnhandledPromiseRejectionWarning: data and salt arguments requiredUnhandledPromiseRejectionWarning:需要数据和盐参数
【发布时间】:2020-10-28 22:19:24
【问题描述】:

问题:我在尝试注册新用户时在使用邮递员时不断收到标题错误,不知道为什么。

另外,代理问题:无法代理请求 /api/auth/register?hello&world 从 localhost:3000 到 http://localhost:8080/。

我试图解决代理的事情是 在包json中添加"secure": false

我的 auth.js 文件:

exports.postRegister = async (req, res, next) => {
  // User object
  const newUser = {
    username: req.body.username,
    password: req.body.password,
  };
  // Check if user exists
  try {
    const user = await User.findOne({ username: newUser.username });
    if (user) {
      const error = new Error("Username already taken.");
      error.statusCode = 422;
      return next(error);
    }
  } catch (error) {
    error.statusCode = error.statusCode || 500;
    next(error);
  }

  // creating a hash from the given password
  bcrypt.genSalt(12, (err, salt) => {
    if (err) {
      return next(err);
    }
    bcrypt.hash(newUser.password, salt, null, async (err, hash) => {
      if (err) {
        return next(err);
      }
      try {
        // set hashed password as the password field in newUser object.
        newUser.password = hash;

        // Save newUser
        const createdUser = new User(newUser);
        await createdUser.save();

        // Create jwt token and send
        const token = await genToken(createdUser._id, createdUser.username);
        res.status(201).json({
          success: true,
          token,
        });
      } catch (err) {
        err.statusCode = err.statusCode || 500;
        next(err);
      }
    });
  });
};

Server.js 文件:

const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const helmet = require("helmet");
const cors = require("cors");

require("dotenv").config();

const mailRoutes = require("./routes/mail");
const authRoutes = require("./routes/auth");

const app = express();

app.use(bodyParser.json());
app.use(helmet());
app.use(cors());

// Routes
app.use("/api/mail", mailRoutes);
app.use("/api/auth", authRoutes);

app.use((error, req, res, next) => {
  console.log(error.message);
  res.status(error.statusCode).json({
    error: true,
    messages: [error.message],
  });
});

mongoose.connect(process.env.DB_URI, (err) => {
  if (err) {
    console.log(err);
  } else {
    console.log("DB Connected");
  }
});

const PORT = process.env.PORT || 5000;

app.listen(PORT, () => {
  console.log(`Server has started at ${PORT}`);
});

【问题讨论】:

  • 尝试控制台记录传递给 bcrypt 的密码和盐值。
  • salt 返回一堆随机乱码,这意味着它的工作原理与密码相同,它通过正确的用户输入
  • 但错误说明相反。它说需要数据和盐,这意味着您没有将它们传递给 bcrypt。
  • 所以显然 bcrypt.hash 内部的控制台日志没有记录,所以我猜它没有访问它可能是我的问题。有什么想法吗?

标签: javascript reactjs express authentication bcrypt


【解决方案1】:

好的,任何面临同样问题的人 - 我想通了。 从箭头函数更改为常规函数。 显然 bcrypt 不接受箭头函数

所以而不是:

bcrypt.hash(newUser.password, salt, async => (err, hash){}...

这样做:

bcrypt.hash(newUser.password, salt, async function (err, hash){}...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多