gpt4 book ai didi

node.js - 如何从另一个在 express `res` 中调用的函数返回 `router` ?

转载 作者:行者123 更新时间:2023-12-04 08:13:15 26 4
gpt4 key购买 nike

我正在尝试做这样的事情,

// /api/auth

const validateFields = ({ name, email }, res) => {
if (!name.trim()) return res.status(422).json({ error: 'name' })
if (!email.trim()) return res.status(422).json({ error: 'email' })
}

router.post('/', async (req, res) => {
const { name = '', email = '' } = req.body

validateFields({ name, email }, res)

return res.end()
})
如果有人传递了无效的姓名或电子邮件,比如说一个空字符串,前端会收到预期的错误,但后端 (ExpressJS) 会抛出错误,
Error: Can't set headers after they are sent
我有点被迫做以下事情,
const validateFields = ({ name, email }, res) => {
if (!name.trim()) return res.status(422).json({ error: 'name' })
if (!email.trim()) return res.status(422).json({ error: 'email' })

return true
}

router.post('/', async (req, res) => {
const { name = '', email = '' } = req.body

const validFields = validateFields({ name, email }, res)

if (validFields !== true) return

return res.end()
})
这是我唯一的选择吗?

最佳答案

这不是编码它的唯一方法,但您通常必须检查是否有错误,如果没有,则发送您的正常响应。
我个人不喜欢有时发送响应有时不发送响应的函数,因为这会混淆逻辑流程。我发现最好是创建一个发送所有可能响应的函数,或者使它成为一个只返回状态然后调用者发送响应的函数。或者,使用中间件设计,如果它发送响应,则处理不会继续进行(因为没有调用 next())。
在这种特殊情况下,您可以只返回错误状态并让调用者发送最终响应。那么它总是一致的。响应总是由调用者和 validateFields() 发送只返回一个结果:

const validateFields = ({ name, email }) => {
if (!name.trim()) return { status: 422, error: 'name' };
if (!email.trim()) return { status: 422, error: 'email' };
return { status: 200, ok: true };
}

router.post('/', async (req, res) => {
const { name = '', email = '' } = req.body;
const result = validateFields({ name, email });
res.status(result.status).json(result);
});
中间件设计可以这样工作:
const validateFields = (req, res, next) => {
const { name = '', email = '' } = req.body;
if (!name.trim()) return res.status(422).json({ error: 'name' });
if (!email.trim()) return res.status(422).json({ error: 'email' });
next();
}
router.post('/', validateFields, async (req, res) => {
res.send("ok");
});

关于node.js - 如何从另一个在 express `res` 中调用的函数返回 `router` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65842128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com