Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在express.js中在路由之间传递数据_Node.js_Express - Fatal编程技术网

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

Node.js 如何在express.js中在路由之间传递数据,node.js,express,Node.js,Express,希望有人能帮助我。找不到解决办法。也许我也走错了路? 这是一个简单的快速设置,我是个新手。 我从一个请求中得到一个响应,并希望将一个变量/响应中的数据传递到下一个路由的URL中。 因此,下一个URL中的一个参数应该是动态的,这取决于第一次调用的响应 这是我的全部代码: 我的问题是在哪里可以看到const sendoutID const express = require("express"); const app = express(); const request = re

希望有人能帮助我。找不到解决办法。也许我也走错了路? 这是一个简单的快速设置,我是个新手。 我从一个请求中得到一个响应,并希望将一个变量/响应中的数据传递到下一个路由的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}`);
});


  • 要传递到下一个路由,您可以将
    results.CreateSendoutResult.SendoutId
    分配给
    req.body

    req.body.SendoutId=results.CreateSendoutResult.SendoutId

  • 然后,您可以在下一个路由中使用该SendoutId

  • 您可以在
    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}`);
    });
    
    
    
  • 您应该使用中间件功能
  • 什么是中间件功能

    ->这只是一个在中间运行的函数(在请求到达路由并在请求完成之前结束)。

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

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

    (二)

    谢谢你的帮助。 我现在发现了另一个解决方案,该解决方案与我发现的另一个问题一样有效。我不知道这是否也是导致该解决方案不起作用的原因,或者您的解决方案不起作用的原因。但我使用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
          }
        }
      );
    });
    
    

    谢谢你的快速回答!我尝试了你的建议,但似乎我仍然做错了什么。你可以将它添加到我的代码中,这样我就可以再次检查我是否在正确的位置添加了所有符号吗?你提到我需要此数据“results.CreateSendoutResult.SendoutId”“下一条路。你这是什么意思?要发送响应以创建发送路由吗?我从第一个路由器中的端点获得一个响应。在这个响应中是一个“sendoutId”。这个“sendoutId”需要是下一个路由器中端点的参数。url:
    https://www.something.com/api/v1.2/surveys/904211/sendouts/${sendoutId}/受访者
    已更新我的答案,希望这能回答您的问题。谢谢,不幸的是,它仍然不起作用。我已经尝试了很多,改变了很多。检查是否正确写入了每个变量。。但它仍然无法识别id。它显示在我的控制台中,而且它是正确的,我确信这一点,但它没有将id作为参数添加到URL中。谢谢,我尝试了您的解决方案,但到目前为止它没有工作。但是感谢中间件的提示。我需要对此进行更深入的研究。我在try语句中添加了一个更正(将const req更改为req=…)。为什么我删除了,因为const req将创建一个新变量,而我们希望使用相同的请求,因此req.SendoutID将只向以前存在的req对象添加一个属性。它现在应该可以工作了。谢谢!我已经试过了,但没用。但我在第一次测试中发现了另一个解决方案。也许你的解决方案现在也会起作用,因为我发现了另一个“问题”,这可能也是一个原因。我会把它作为新的评论发布。无论如何,感谢您的帮助:)它现在可以工作了,因为前面的“const req”语句错误地生成了一个新变量,但是当我们将其更改为仅为req.SendOutID=results.CreateSendoutResult.SendOutID时;它向现有的req对象添加一个新属性。
    // 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
          }
        }
      );
    });