如何在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的设计,任何编程语言或框架都不能按您所期望的方式工作