如何在express.js中的路由之间传递数据

时间:2020-08-29 13:38:19

标签: node.js express

希望有人可以帮助我。找不到解决方案。也许我也走错了路? 这是一个简单的快速设置,我很新。 我从请求中获得响应,并希望将响应中的变量/数据传递到URL的下一条路由。 因此,下一个URL中的一个参数应该是动态的,具体取决于第一次调用的响应。

这是我的完整代码:

我的问题是在哪里可以看到const sendoutID

const express = require("express");
const app = express();
const request = require("request");
const bodyParser = require("body-parser");
const port = 3001;

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));




// Create Sendout
app.post("/createSendout", (req, res, next) => {
  request.post(
    {
      url: "https://www.something.com/api/v1.2/surveys/904211/sendouts",
      body: JSON.stringify(req.body),
      headers: {
        "Content-Type": "application/json",
        "X-API-KEY": "xxxx-xxx-xxxx-xxx-xxxxxxx",
      },
    },
    function (error, response, body) {
      console.log(response.statusCode);
      if (!error && response.statusCode == 200) {
        // Successful call
        var results = JSON.parse(body);
        console.log(results.CreateSendoutResult.SendoutId); // View Results

// I want this data "results.CreateSendoutResult.SendoutId" passing to the next route

       
      }
    }
  );
});


/* here the variable is just hard coded for now but 
I want to pass it in the URL from my previous route 
to the next route see below at + sendoutID +..*/

const sendoutId = 389125;


// Add Respondent
app.post("/addRespondent", (req, res, next) => {
  request.post(
    {
      url:
        "https://www.something.com/api/v1.2/surveys/904211/sendouts/" +
        sendoutId +
        "/respondents",
      body: JSON.stringify(req.body),
      headers: {
        "Content-Type": "application/json",
        "X-API-KEY": "xxxxxx-xxx-xxx-xxx-xxxxxxxx",
      },
    },
    function (error, response, body) {
      console.log(response);
      //console.log(response.statusCode);
      if (!error && response.statusCode == 200) {
        // Successful call
        var results = JSON.parse(body);
        console.log(results); // View Results
      }
    }
  );
});


app.listen(port, () => {
  console.log(`app listening at http://localhost:${port}`);
});


3 个答案:

答案 0 :(得分:0)

  1. 要转到下一条路线,可以将results.CreateSendoutResult.SendoutId分配给req.body

    req.body.SendoutId = results.CreateSendoutResult.SendoutId;

然后,您可以在下一条路线中使用该SendoutId。

  1. 您可以在next()

    内部传递该变量

    next(results.CreateSendoutResult.SendoutId);

在下一条路径中,您可以通过以下方式访问它:

function nextRoute(SenderId, req, res, next)

编辑:

const express = require("express");
const app = express();
const request = require("request");
const bodyParser = require("body-parser");
const port = 3001;

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));




// Create Sendout
app.post("/createSendout", (req, res, next) => {
  request.post(
    {
      url: "https://www.something.com/api/v1.2/surveys/904211/sendouts",
      body: JSON.stringify(req.body),
      headers: {
        "Content-Type": "application/json",
        "X-API-KEY": "xxxx-xxx-xxxx-xxx-xxxxxxx",
      },
    },
    function (error, response, body) {
      console.log(response.statusCode);
      if (!error && response.statusCode == 200) {
        // Successful call
        var results = JSON.parse(body);
        console.log(results.CreateSendoutResult.SendoutId); // View Results

// I want this data "results.CreateSendoutResult.SendoutId" passing to the next route

      req.SendoutId = results.CreateSendoutResult.SendoutId;
       
      }
    }
  );
}, addRespondent);


/* here the variable is just hard coded for now but 
I want to pass it in the URL from my previous route 
to the next route see below at + sendoutID +..*/

const sendoutId = 389125;


// Add Respondent
app.post("/addRespondent", addRespondent);

function addRespondent(req, res, next) => {
  request.post(
    {
      url:
        "https://www.something.com/api/v1.2/surveys/904211/sendouts/" +
        req.sendoutId +
        "/respondents",
      body: JSON.stringify(req.body),
      headers: {
        "Content-Type": "application/json",
        "X-API-KEY": "xxxxxx-xxx-xxx-xxx-xxxxxxxx",
      },
    },
    function (error, response, body) {
      console.log(response);
      //console.log(response.statusCode);
      if (!error && response.statusCode == 200) {
        // Successful call
        var results = JSON.parse(body);
        console.log(results); // View Results
      }
    }
  );
}


app.listen(port, () => {
  console.log(`app listening at http://localhost:${port}`);
});


答案 1 :(得分:0)

  1. 您应该使用中间件功能。

什么是中间件功能?

->它只是在中间运行的函数(在请求到达路由之前并在请求完成之前结束。Express Documentation for writing middlewares.

中间件函数是可以访问请求对象(req),响应对象(res)和下一个函数的函数。注意中间件函数不会结束请求-响应周期,它必须调用next()将控制权传递给下一个中间件函数。否则,该请求将被挂起。

使用中间件功能的优势->“您将来也可以将此功能用于其他任何请求”,在其他模块中使用它。”

2)

const captureSendOutIDMiddleware = async (req, res, next) => {
    try {
         req.SendOutID=results.CreateSendoutResult.SendoutId; //changed "const req" to just req.
             next();

    } catch (error) {
        res.status(401).send({
            error: 'NO SEND OUT ID'
        })
    }
app.post("/CreateSendOut",captureSendOutIDMIddleware,async(req, res) =>{
//do your operation

});

app.post("/addRespondent",async(req,res)=>{

const capturedSendoutID=req.SendoutID;
console.log(capturedSendoutID);
//do you operations

});

答案 2 :(得分:0)

感谢您的帮助。 我现在发现了另一个可行的解决方案,同时又发现了另一个问题。不知道这是否也是为什么它不起作用或您的解决方案不起作用的原因。但是我使用了app.set()和app.get来传递数据。 另一个问题是,现在使用app.set()和app.get()有时可以工作,有时不能工作。因此,我在前端的调用中设置了超时,该超时将执行api请求。只是之间有一点时间。 这是我的新代码

// Create Sendout
app.post("/createSendout", (req, res, next) => {
  request.post(
    {
      url: "https://www.something.com/api/v1.2/surveys/904211/sendouts",
      body: JSON.stringify(req.body),
      headers: {
        "Content-Type": "application/json",
        "X-API-KEY": "xxxxxx-xxx-xx-xxxx-xxxxx",
      },
    },
    function (error, response, body) {
      console.log(response.statusCode);
      if (!error && response.statusCode == 200) {
        // Successful call
        var results = JSON.parse(body);
        console.log(results.CreateSendoutResult.SendoutId); // View Results
        app.set("surveyId", results.CreateSendoutResult.SendoutId);    // new added line
      }
    }
  );
});


// Add Respondent
app.post("/addRespondent", (req, res, next) => {
  const surveyId = app.get("surveyId");        // new added line
  request.post(
    {
      url:
        "https://www.something.com/api/v1.2/surveys/904211/sendouts/" +
        surveyId +
        "/respondents",
      body: JSON.stringify(req.body),
      headers: {
        "Content-Type": "application/json",
        "X-API-KEY": "xxxxxx-xxx-xxxx-xxxx-xxxxxxxx",
      },
    },
    function (error, response, body) {
      console.log(response);
      //console.log(response.statusCode);
      if (!error && response.statusCode == 200) {
        // Successful call
        var results = JSON.parse(body);
        console.log(results); // View Results
      }
    }
  );
});