中间件电子邮件重复控制错误的代码建模

Middleware Email duplicate controls bad code modeling

我需要为电子邮件重复控件添加一个 node.js 快速中间件,以及一个简短易看的代码。

这是我的 middleware.js 文件 :

// -----------------------------------      MIDDLEWARE FUNCTIONS -------------------------------------------
module.exports = {
    /*
     * CHECKING FOR DUPLICATE EMAIL 
     * @params 
     * @return NEXT()
     * @error  Status 403s
     */
    async duplicate_email(db, req, res, next) {
        let availableEmail = await db.collection("users").findOne({ 'email': req.body.email })
        if (!availableEmail) {
            console.log(" FORBIDDEN  ")
            res.status(403).send({ errorCode: "403" })
            return
        } else {
            next() // continue the process
        }
    }
}

这是我的注册 web 服务,在另一个名为 usersCrud.js 的文件中,我已经花了 3 天时间努力让它工作但没办法:

/*
* Register anonymous user
* @params JSON OBJECT : {}
* @return 200
* @error  400
*/
app.post("/registerUser", middleware.duplicate_email(), function(req, res) {

    try {
        var user = new User({
            _id: null,
            prenom: req.body.prenom,
            nom: req.body.nom,
            email: req.body.email,
            password: bcrypt.hashSync(req.body.password, 10),
            role: "user",
            permissions: middleware.create_permissions("user"),
            filenames: [],
            groups: [],
            last_update: new Date(),
            img: "",
            birthday: "",
            age: "",
            job: "",
            mentra: "",
        });
        db.collection("users").insertOne(user);
        console.log("Added one user");
        res.sendStatus(200);
    } catch (e) {
        console.log(e);
        res.sendStatus(400);
    }

});

这是错误:

Error: Route.post() requires a callback function but got a [object Promise]

我尝试了很多东西,比如添加 db 参数,使用 return 函数,删除所有参数,但我无法让它工作。如果那个东西能像这样工作,代码会非常简单,但我不知道这是否可能。 也许很容易为您解决。

你试过这样做吗?

app.post("/registerUser", await middleware.duplicate_email(), function(req, res)

它必须包含在 async 函数中,当然才能使用 await 关键字。正如错误所说,回调是预期的,但你提供了一个未解决的 Promise。 另一件可能有用的事情是:

app.post("/registerUser", async () => { 
    const result = await middleware.duplicate_email(); 
    return result;
}, function(req, res) {
   // stuff
}

错误消息告诉您出了什么问题,因为您在 app.post 中调用了 middleware.duplicate_email(),因此 returns 是一个承诺。您需要传递该函数而不调用它或将其定义为 returns 中间件并将 db 对象作为参数的工厂函数。我会采用第二种方法,它看起来像:

module.exports = {    
    duplicate_email(db) {
        return async (req, res, next) => {
            let availableEmail = await db.collection("users").findOne({'email': req.body.email})
            if (!availableEmail) {
                console.log(" FORBIDDEN  ")
                res.status(403).send({errorCode: "403"})
                return
            } else {
                next() // continue the process
            }
        }
    }
}

然后您可以像这样使用它:

app.post("/registerUser", middleware.duplicate_email(db), function(req, res) { ... }