Express node.js forEach route

Express node.js forEach route

我试图为我使用 forEach 循环的每个 ID 创建路线,但它一直在加载,直到 timeout 到达,所有预期值都已到位,一切都很好,但第二条路线是不是运行ning,直到现在我都在拼命地对抗它。我确定有问题。

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, (req, res) => { // here is the problem
            console.log("uh")
            res.send("HAMBURGER")
            console.log(req, res, 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) 请求

有什么想法吗?

您永远不会从外部 res.get() 处理程序调用 res.end(),因此请求永远不会完成。

而且,恕我直言,在循环中创建这样的路由处理程序是错误的。当您的应用获得数千 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, res, guildid)
   } else {
     next(createError(404, guildId + ' not found'))
   }
})

您可能需要重新设计 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

感谢大家的帮助。

最终结果:

server.js

router.get('/:guildid', isAuthorized, (req, res, 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);
    }
})