【问题标题】:How to Pass Data Between Routes in Express如何在 Express 中的路由之间传递数据
【发布时间】:2016-04-20 05:01:26
【问题描述】:

假设我有这个接收一些数据的POST 路由。

app.post('/getData', function(req, res){
  var retrievedData = req.body.exampleVariable;
   // Send data to GET method
});

我有这个呈现页面的GET 方法,但需要我在POST 方法中检索到的数据

app.get('/displayData', function(req, res){
  // Retrieve data from POST method and display it.
  res.render('/examplePage.ejs', {retrievedData : req.retrievedData});
});

retrievedData 变量从给定的POST 路由传递到GET 路由的最佳方法是什么?

附带说明,res.render() 方法似乎只适用于 app.get() 类型方法

【问题讨论】:

    标签: node.js post express get routes


    【解决方案1】:

    你可以使用

    app.post('/getData', function(req, res){
      app.set('data', req.body.exampleVariable);
    });
    app.get('/displayData', function(req, res) {
      res.render('/examplePage.ejs', {retrievedData : app.get('data')});
    });
    

    但不保证返回的数据一定是用户设置的数据,直到用户请求获取路由才会发送数据。这也使您的快速服务器有状态,这可能带来很多缺点。

    你可以阅读一下here

    如果您希望您的应用程序是无状态的,则可以将您的应用程序传递到外部某个地方,例如独立于 express 服务器的远程服务器(如 mysql)。

    如果它有任何用处,如果您愿意,您还可以在同一请求中发送和接收数据,正如您在评论中所做的那样,这似乎是您想要做的。 如果您有类似下面的内容,它应该可以正常工作,只要您确定向“/data”发出“POST”请求,考虑到“GET”请求可以正常工作。

    app.post('/data', function(req, res){
      res.render('/examplePage.ejs', {
        retrievedData: req.body.exampleVariable
      });
    });
    

    下面是一个示例快递应用程序,展示了它是如何工作的

    form.jade

    form(method="post" action="data")
      input(type="text" name="data" value="some data")
      input(type="submit" value="submit")
    

    data.jade

    h1=data
    

    server.js

    require('express')()
      .use(require('body-parser').urlencoded({ extended: false }))
      .get('/form', (req, res) => res.render('form.jade'))
      .post('/data', (req, res) => res.render('data.jade', { data: req.body.data }))
      .listen(8083);
    

    如果您启动服务器并转到“localhost:8083/form”, 提交表单后,您会看到一个包含您发布的数据的渲染页面。

    【讨论】:

    • 我已经尝试过你在过去的最后一个 sn-p 代码上所做的事情,但它不起作用。尝试在 app.post 方法中使用 res.render() 似乎不起作用。实际页面可能会被渲染,但用户看不到它,因为页面没有重新加载。要重新加载页面,您需要使用带有 GET 方法的 res.redirect(),这将显示渲染的页面,但是来自 POST 方法的数据不会被传入。
    • 你可以使用我刚刚添加的代码和ejs而不是jade,你不必使用res.redirect()来让它工作。这是你的意思吗?
    • 是的,我就是这个意思。您说的确实是正确的,但是我也面临另一个问题,即不允许 res.render() 在 app.post() 方法中执行,所以我错误地认为 res.render() 仅在内部起作用app.get() 方法。不过,谢谢您花时间和精力回复,我非常感谢。关于我在这里面临的另一个问题,我在这里问了另一个问题:stackoverflow.com/questions/34801387/…
    【解决方案2】:

    我发布这个假设你正在运行 express.js/node.js。所有目录都在根目录下。

    我认为您可以只使用一条路线而不是两条路线。假设你有 javascript 函数/方法来获取根目录下的目录中的数据调用 getModules 并且你的方法存储在一个文件调用 getData.js 中。

    routes/index.js

    var getDataModule = require('../getModules/getData.js');
    
    router.post('/getData', function(req, res) {
      getDataModule.gatData(req.body, function(data) {
        res.render('/displayData', { title: 'Title', results: data });
      });
    });
    

    那么你的功能应该是导出数据。否则不会采用这种方式。 getData.js 可以是这样的。

    getModules/getData.js

    module.exports.getData = function(data, callback){
      //body that work on data or what ever the logic including a callback
    }
    

    然后你可以在 displayData.ejs 中渲染结果,类似于普通的 HTML 页面。但是,如果您打算将此 diplayData.ejs 用作模板,则可以在正文中包含 examplePage.ejs。

    代码说明

    使用此编码,您可以将带有 req.body 的内容发送到您的函数或不发送。但返回值将与数据对象一起发送。然后将其提供给您的下一条路线,该路线将把数据呈现为 HTML。您要显示的内容在结果对象/数组中。您可以通过 等方式访问对象的属性。但是你需要知道属性的标识符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2015-11-16
      • 2018-12-11
      • 2018-09-14
      相关资源
      最近更新 更多