中间件电子邮件重复控制错误的代码建模
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) { ... }
我需要为电子邮件重复控件添加一个 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) { ... }