如何解决Express node.js forEach 路由
我试图为我使用 forEach
循环的每个 ID 创建一条路线,但它会一直加载直到 timeout
到达,所有预期值都已到位,一切正常,但第二条路线没有运行,直到现在我都在与它作斗争。我确定有问题。
server.js
const router = require('express').Router();
function isAuthorized(req,res,next) {
if (req.user) {
next();
}
else {
res.redirect('/login')
}
}
let myguild = [];
router.get(`*`,isAuthorized,(req,res) => {
res.status(200);
console.log("wow");
console.log(req.user.guilds.length)
req.user.guilds.forEach(guild => {
myguild.push(guild);
})
console.log("Finished");
myguild.forEach(guild => {
console.log('Started')
router.get(guild.id,res) => { // here is the problem
console.log("uh")
res.send("HAMBURGER")
console.log(req,guild)
})
console.log("Outed")
})
});
module.exports = router;
output:
wow
23
Finished
Started
Outed
Started
Outed
Started
Outed
Star... 'there is more but this is enough'
它应该在 server/${guild.id}
内运行,但收到 (failed)
请求
有什么想法吗?
解决方法
您可能需要重新设计 API 以更好地适应您要完成的任务。如果您已经知道哪些公会可用,那么您需要在服务器初始化之前创建这些公会。
即使它们来自数据库或动态,您也可以遍历公会“选项”并创建端点,然后仅当用户合格时才提供对它们的访问。
const { guilds } = require('./config')
const guildHandler = (req,res) => {
// Assuming you're doing more here
res.send('Hamburger')
}
guilds.forEach(guild => router.get(`/guilds/${guildId}`,guildHandler)
或者,如果您没有在每个公会的中间件中做一些不同的事情,那么您可以只为公会设置一条路线。
router.get('/guilds/:guildId,guildHandler)
不太确定您要完成什么,但请查看 Express 文档。它们可以轻松解决大多数用例。
https://expressjs.com/en/api.html#req
,您永远不会从外部 res.end()
处理程序调用 res.get()
,因此请求永远不会完成。
而且,顺便说一句,在循环中创建这样的路由处理程序是错误的。当您的应用获得数千个 guild
时,这将导致真正的性能问题。
您只需要使用一个带有 named route parameter 的路由,就像这样。
const createError = require('http-errors')
router.get(':guildid',isAuthorized,(req,res,next) => {
const guildid = req.params.guildid
if (req.user.guilds.includes(guild)) {
console.log("uh")
res.send("HAMBURGER").end()
console.log(req,guildid)
} else {
next(createError(404,guildId + ' not found'))
}
})
,
感谢大家的帮助。
最终结果:
server.js
router.get('/:guildid',next) => {
console.log('started')
const guildid = req.params.guildid
if (req.user.guilds.some(guild => guild.id === guildid)) {
console.log('uh')
res.send("HAMBURGER").end()
} else {
res.sendStatus(404);
}
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。