linux - Promise { <pending> } React bcrypt 散列密码

我正在使用 Nodejs 创建登录/注册表单。我正在使用 bcrypt.js 对用户输入的密码进行哈希处理,但是当我将密码分配给一个变量以便将其推送到数据库时,我收到此错误“Promise { pending }”。我正在学习nodejs并做出反应,所以我对此不太了解,有人可以帮助我。谢谢!

我正在运行的代码是:

################################

const express = require('express');
const app = express();
const mysql = require('mysql2');
const bcrypt = require('bcryptjs'); 
const cors = require('cors');

// Need this to make api request from backend
app.use(cors());

/**using this express will format the data automatically in json format */
app.use(express.json()); /**Use This Otherwise you get the req.body undefined */

const port = 3001;

const securePassword = async (password) => {
     const passwordHash = await bcrypt.hash(password, 4);
     return passwordHash;
}; 
const db = mysql.createConnection({
 user: 'root',
 host: 'localhost',
 password: 'newpassword',
 database: 'INSTAGRAM', 
 });

 // Getting Data From Signup Form of React
app.post('/signup', (req, res) => {
  const emailaddress = req.body.emailaddress;
  const fullname = req.body.fullname;
  const username = req.body.username;
  const password = req.body.password;
  const hashPass = securePassword(password);
  console.log(hashPass);
  // Checking If Use Already Exist
  db.query(
     'SELECT * FROM USER WHERE username = ? OR email = ? ',
   [username, emailaddress],
   (err, result) => {
     if (err) {
      res.send({ err: err });
     } else {
       if (result.length > 0) {
      res.send({ message: 'Username/Email Already Exist' });
    } else {
      db.query(
        'INSERT INTO USER (username, fullname, email, password) VALUES (?, ?, ?, ?)',
        [username, fullname, emailaddress, hashPass],
        (err, result) => {
          if (err) {
            res.send(err);
          } else {
            res.send(result);
          }
        }
      );
    }
  }
}
 );
});

// Starting the server on port 3001
app.listen(port, () => {
   console.log(`SERVER STARTED ${port}`);
});

回答1

首先,为了更好、更专业的编码,请尝试将您的代码分解为多个 .js 文件中的多个函数。那么你应该传递一个函数来验证输入,否则任何数据都可以传递给 db 而不经过验证。然后您可以使用此代码进行用户注册:

app.js 文件:

const express = require('express');
const app = express();
const userRouter = require('./routes/user.routes');

app.use(express.json());

app.use('/user', userRouter);

user.routes 文件:

const express = require('express');
const userRouter = express.Router();
const {httpHandleSignUp} = require('../controllers/user/user.controller');

userRouter.post('/signup', httpHandleSignUp);

module.exports = userRouter

然后为了处理注册,您可以创建一个控制器文件并首先检查输入:

httpHandleSignUp 控制器代码:

async function handleSignUp(req, res) {
    const values = req.body
    const errors = await validateInputs(values, res);

    if(errors.length == 0) {
        await addUserToDB(values, res);
    } else {
        res.json(errors)
    }
}

您可以使用任何您想要的验证,如下面的代码:

async function validateInputs(values, res) {
    let errors = [];

    if(!values.name || !values.email || !values.password) {
        errors.push('missing required inputs');
    }

    if(!/\S+@\S+\.\S+/.test(values.email)) { // regex : string@string.string
        errors.push('invalid email address ');
    }

    if(values.password.length < 8) {
        errors.push('entered password is too short !');
    }

    if(await checkDbForEmail(values.email)) {
        errors.push('a user with this email already registered !');
    }

    // TODO : add more validation 

    return errors;

}

并且您还需要一个函数来检查用于上述函数的已注册用户的数据库:

async function checkDbForEmail(email) {
    return await user.findOne({
        email: email
    });
}

现在,如果没有错误,用户将通过此功能添加到数据库:

async function addUserToDB(values, res) {
    bcrypt.hash(values.password, saltRounds)
        .then(hashedPass => {
            user.create({
                name: values.name,
                email: values.email,
                password: hashedPass
            }, (err, user) => {
                res.json({
                    ok : 'user added to db successfully',
                    data: {
                        name: user.name,
                        email: user.email
                    }
                });
            });
        })
        .catch( (err) => console.log(err));
}

提示:此代码适用于 mongo,您可能需要更改 DB 函数。

相似文章

随机推荐

最新文章