簡體   English   中英

在等待時出錯,該等待僅在使用異步函數時對異步函數有效

[英]Getting error on await, that await is valid only on async function when using async function

我正在使用異步函數來確認用戶是否存在於具有相同用戶名或電子郵件的數據庫中。

事情是我在單獨的文件中有異步功能。 我正在將文件導入到某些端點的路由中。

當我在刪除后發送注冊用戶的請求時

await

從 User.CreateNewUser 和 User.ValidateUserExists 它通過,但是當我再次發送相同的請求時,相同的用戶被添加到數據庫中,而不驗證用戶是否存在於數據庫中。

這是我的路線

const express = require("express");
const router = express.Router();
const asyncHandler = require('../helpers/asyncHandler');
const validate = require('validate.js');
const User = require('../controllers/user-exists-check');


//Route for creating user

router.post('/', asyncHandler((req,res) => {
    const constraints = {
        username: {
            presence: true,
            length:{minimum:4,maximum:10}
        },
        password: {
            presence: true,
            length:{minimum:6, maximum:20} 
        },
        email: {
            presence: true,
            email:true
        }}
    const username = req.body.username;
    const email = req.body.email;
    const password = req.body.password;
    const permission_id = req.body.permission_id;

    const validation = validate({username, email, password}, constraints);
    if(validation) res.status(400).json({error: validation});

    const existingUser = await User.ValidateUserExists({username, email});
    if(existingUser) {
        if(username === existingUser.username) return res.status(400).json({error:`Username ${username} is already taken`});
        if(email === existingUser.email) return res.status(400).json({error:`Email is already taken`});
    }

    const newUser = await User.CreateNewUser({username, email, password, permission_id});
    return res.status(200).json({user: newUser})

}));


module.exports = router;

這是用戶存在檢查

const {UserNameExists, EmailExists, CreateUser} = require('./user-db-check');

async function ValidateUserExists(username, email) {
    if(!username || !email ) throw new Error('Not enough args provided')
    let ValidUsername = null;
    let ValidEmail = null;

    if(username) {
        ValidUsername = await UserNameExists(username);
    }
    if(email) {
        ValidEmail = await EmailExists(email);
    }
    if(ValidUsername && ValidEmail) return ValidUsername;
    return null;
}

async function CreateNewUser(args){
    return await CreateUser(args)
}

module.exports = {
    ValidateUserExists,
    CreateNewUser
}

我期待它拋出這個響應

if(username === existingUser.username) 
return res.status(400).json({error:`Username ${username} is already taken`});

if(email === existingUser.email) return res.status(400).json({error:`Email is already taken`});

我是否以錯誤的方式使用 await 和 async? 有人可以啟發我嗎

您的問題是您發送到asyncHandler(函數回調未標記為異步,因此您在內部使用的任何函數都不能使用await

假設你的asyncHandler期待一個承諾,做asyncHandler(async (req,res) => {應該解決這個問題。

作為旁注,在查看您的代碼時,您可能需要考慮一個基本的邏輯問題。 在多用戶環境中執行UserNameExists / EmailExits & 然后CreateUser ,理論上仍然可以允許存儲相同的用戶和電子郵件。 大多數數據庫都有一種叫做事務鎖的東西來防止這種情況發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM