路由中的Express.js http调用不更新变量

时间:2017-03-10 13:15:42

标签: javascript node.js http express request

我正在express.js上构建一个REST api。我无法更新路线中的变量。

示例:

我正在呼叫app.get("/wp/page/create/:id", function(req, res)

在此路线中,我首先使用request-promise库调用http请求。我在嵌套的http调用中使用此调用的响应。

我使用全局变量作为嵌套调用的标头,并使用etag变量进行标题更改。

代码:

global.postHeaders = headers;
postHeaders['X-HTTP-Method'] = "MERGE";
postHeaders['Content-Type'] = 'application/json;odata=verbose';
postHeaders['X-RequestDigest'] = spContext;

request.get({
url: "xxx",
headers: headers,
json: true
}).then(function(response) {
    var etag = response.d.__metadata.etag
    postHeaders['If-Match'] = etag;

    request.post({
       url: "xxx",
       type: "POST",
       body: data,
       headers: postHeaders,
       json: true
       }).then(function(data) {
          res.send(data).end()
          console.log("All done!");
      })
})

当我启动服务器并输入路线时,一切正常。当我试图再次点击时,etag变量仍然是相同的,即使它应该更新。

如果我重新启动服务器,它会在第一次尝试时再次运行,但在第二次/第三次尝试时失败。

知道我做错了吗?

2 个答案:

答案 0 :(得分:3)

我已经解决了这些问题。简单的解决方案是清除包含变量的标题。

global.postHeaders = headers;
postHeaders['X-HTTP-Method'] = "MERGE";
postHeaders['Content-Type'] = 'application/json;odata=verbose';
postHeaders['X-RequestDigest'] = spContext;

request.get({
 url: "xxx",
 headers: headers,
 json: true
 }).then(function(response) {
var etag = response.d.__metadata.etag
postHeaders['If-Match'] = etag;

   request.post({
     url: "xxx",
     type: "POST",
     body: data,
     headers: postHeaders,
     json: true
     }).then(function(data) {
      postHeaders['If-Match'] = "";
      res.send(data).end()
      console.log("All done!");
  })
})

答案 1 :(得分:1)

postHeaders是一个全局变量。是global.postHeaders = headers;中的标题也是全局可变的?无论你想在这里做什么都是非常错误的。 postHeaders变量将在多个请求中共享。因此,您将遇到postHeaders['If-Match']值可能为空字符串或etag的情况。

尝试使用此代替第一行 var postHeaders = Object.assign({}, headers);

不确定你在尝试什么,但至少这句话将消除代码中的巨大错误。这将为每个请求创建一个新的头对象。