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 文档。他们很容易解决大多数用例。
感谢大家的帮助。
最终结果:
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);
}
})
我试图为我使用 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 文档。他们很容易解决大多数用例。
感谢大家的帮助。
最终结果:
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);
}
})