如何在Node.js中同时路由
在我的如何在Node.js中同时路由,node.js,express,Node.js,Express,在我的路由器中,当我访问/quick时,我想呈现quick.ejs,并通过dogetquick获取测验数据,以在quick.ejs中显示它们 我想我必须以某种方式重写路由器 跟随我的工作 router.get('/quiz',(req,res)=>{ res.render("quiz"); }); router.get('/quiz',quizController.doGetQuiz); 这是我的控制器 const Quizes = require("
路由器
中,当我访问/quick
时,我想呈现quick.ejs
,并通过dogetquick
获取测验数据,以在quick.ejs
中显示它们
我想我必须以某种方式重写路由器
跟随我的工作
router.get('/quiz',(req,res)=>{
res.render("quiz");
});
router.get('/quiz',quizController.doGetQuiz);
这是我的控制器
const Quizes = require("../models/Quizes");
module.exports = {
doGetQuiz:function(req,res,next){
Quizes.getQuiz(res);
}
};
这是我的模型
const API_KEY="https://opentdb.com/api.php?amount=10&type=multiple";
const fetch = require('node-fetch');
const Quiz=require("../helpers/quiz");
module.exports={
getQuiz:function(res){
fetch(API_KEY)
.then(response => response.json())
.then(json => { const quiz = new Quiz(json);
res.json(quiz);
});
}
};
我想我必须在路由器中组合它们
如果有人有意见,请告诉我
谢谢
如果希望直接在ejs模板中呈现数据,则需要将其作为第二个参数传递
删除控制器并将主路线/控制器修改为:
// This is your main controller, routes and controllers mean the same
// thing so it is kind of stupid to have a controller call another controller
// unnecessarily
const Quizes = require("../models/Quizes");
router.get('/quiz',(req,res)=>{
Quizes.getQuiz().then(data => {
res.render("quiz", data);
});
});
现在修改您的模型:
getQuiz: function(res){
// THIS RETURN IS IMPORTANT to be able to use then in your controller
return fetch(API_KEY)
.then(response => response.json());
}
AJAX
如果您想使用ajax,则需要为测验数据提供一个单独的url:
router.get('/quiz-data',quizController.doGetQuiz);
然后需要使用类似于fetch
或XMLHttpRequest
的方法来获取数据:
fetch('/quiz-data').then(r => r.json).then( ... )
您想使用ajax还是直接在ejs中插入数据?在这个问题中,我搜索了在ejs中插入数据。。但是有什么方法可以像fetch那样获取数据吗(http://localhost:8000/quiz)
??这意味着我要练习在前端和后端提取数据。。谢谢你。方法是一个url。页面和数据的url不能相同。数据需要另一个url,所以执行类似于router.get('/quizdata',quizController.dogetquick)的操作代码>然后取它fetch('http://localhost:8000/quizdata)
如果不想使用fetch,则不要为数据创建单独的控制器。只需执行:Quizes.getquick({json:(data)=>{res.render(“quick”,data);}}})
。当然,如果您在getquick()
中删除res.json()
,只需传递一个常规回调,您就可以执行:Quizes.getquick((数据)=>res.render(“quick”,data))
。而不是调用第二个。然后()
在getquick()
内返回fetch
,您可以这样做:Quizes.getquick()。然后((数据)=>res.render(“quick”,data))
谢谢,我不能使用相同的url的原因是当访问在路由器中点击/quick
时,然后将从顶部处理路由
,然后唯一的第一个/quick
路由将工作?似乎,当我访问/quick
时,数据将无法获得,而不是/quick
,似乎我们必须访问/quick数据
。我的理解错在哪里?谢谢你对HTTP协议的理解有点欠缺。网页背后的协议非常简单——一个请求,一个响应。HTTP不支持对单个请求回复两个响应,因此如果需要两个响应,则必须发出两个请求。这意味着两个URI—请注意,如果使用查询参数,则可以使单个URL提供两个URI,例如:/quick
和/quick?data=true
。由于HTTP的设计,任何编程语言或框架都不能按您所期望的方式工作