Javascript 来自Node.js的API调用

Javascript 来自Node.js的API调用,javascript,node.js,Javascript,Node.js,我有这样一个代码: const req = require("request"); const apiReq = req("http://example.com/car/items.json", (err, res, body) => { if (!err && res.statusCode === 200) { return JSON.parse(body); } }) console.log(apiReq) module.exports.api =

我有这样一个代码:

const req = require("request");
const apiReq = req("http://example.com/car/items.json", (err, res, body) => {
  if (!err && res.statusCode === 200) {
    return JSON.parse(body);
  }
})

console.log(apiReq)

module.exports.api = apiReq;

如果我在apiReq中登录控制台,它将返回实际的JSON响应,但我想将其导出。log(apiReq)返回我的请求对象。这段代码有什么问题?

在您的示例中,HTTP请求是在NodeJS读取您的文件时执行的(您可能不希望它这样做,因为它是一个坏习惯)

您可以通过使用回调来解决这个问题

const req = require("request");
module.exports = function (successCb, errorCb) {
  req("http://example.com/car/items.json", (err, res, body) => {
    if (err) return errorCb(err);
    // You may want to add an additional check for statusCode 200
    // How you handle that depends on your scenario.

    successCb(JSON.parse(body));
  })
}
从另一个文件

const yourReqModule = require('your-req-module')

yourReqModule(function(jsonResponse) {
  handleJsonResponse...
}, function (error) {
   // Handle error
});
通过使用这种技术,HTTP请求在您实际运行
yourReqModule.api()
之前不会执行

编辑:


您应该始终包括错误处理。我已经用这个示例实现更新了代码。

在您的示例中,HTTP请求是在NodeJS读取您的文件时执行的(您可能不希望它这样做,因为它是一个坏习惯)

您可以通过使用回调来解决这个问题

const req = require("request");
module.exports = function (successCb, errorCb) {
  req("http://example.com/car/items.json", (err, res, body) => {
    if (err) return errorCb(err);
    // You may want to add an additional check for statusCode 200
    // How you handle that depends on your scenario.

    successCb(JSON.parse(body));
  })
}
从另一个文件

const yourReqModule = require('your-req-module')

yourReqModule(function(jsonResponse) {
  handleJsonResponse...
}, function (error) {
   // Handle error
});
通过使用这种技术,HTTP请求在您实际运行
yourReqModule.api()
之前不会执行

编辑:


您应该始终包括错误处理。我已经用一个示例实现更新了代码。

您可以尝试导出一个函数,而不是请求对象

const request = require('request')

module.exports = function makeRequest(cb){
  return new Promise((reject, resolve) => {
    request("http://example.com/car/items.json", (err, response, body) => {
        if(cb){
          if(err)
            return cb(err)
          return cb(null, JSON.parse(body));
        } else {
            if(err)
              return reject(err);
            return resolve(JSON.parse(body));
        }
    })
  })
}
然后,在其他模块中

var makeAPIRequest = require('./path/to/module')
makeAPIRequest().then(...).catch(...);
// or via callback
makeAPIRequest((error, body) => {
  if(error){
    // handle error
  } else {
    // handle response
  }
})

您可以尝试导出函数而不是请求对象

const request = require('request')

module.exports = function makeRequest(cb){
  return new Promise((reject, resolve) => {
    request("http://example.com/car/items.json", (err, response, body) => {
        if(cb){
          if(err)
            return cb(err)
          return cb(null, JSON.parse(body));
        } else {
            if(err)
              return reject(err);
            return resolve(JSON.parse(body));
        }
    })
  })
}
然后,在其他模块中

var makeAPIRequest = require('./path/to/module')
makeAPIRequest().then(...).catch(...);
// or via callback
makeAPIRequest((error, body) => {
  if(error){
    // handle error
  } else {
    // handle response
  }
})

你能更清楚地知道你想要实现什么吗?当nodej读取你的文件时,它正在执行实际的请求。我猜您希望在调用导出对象时执行它。将
apiReq
放入函数中并导出该函数function@riyaz-ali我希望apiReq返回JSON而不是请求对象本教程将非常有用:您能更清楚地了解您想要实现什么吗?当NodeJ读取您的文件时,它正在执行实际的请求。我猜您希望在调用导出对象时执行它。将
apiReq
放入函数中并导出该函数function@riyaz-ali我希望apiReq返回JSON而不是请求对象本教程将非常有用: