【问题标题】:Why does funtion in Node return undefined?为什么Node中的函数返回未定义?
【发布时间】:2022-01-19 15:31:14
【问题描述】:

在我发出成功的 http 请求(状态码:200)后,我需要配置我的端点的基本 url。

我已经编写了下面的函数,但它没有像我预期的那样工作......它总是返回undefined。我知道这是关于承诺的事情,但我没有太多经验。

const get = require('./functions/functionGET');

 function geturl() {
  var baseip;
  get(
    "username",
    "password",
    "http://**.***.**.35:8048/TESTDEV02/ODataV4/Company"
  )
    .then((response) => {
      if (response.statusCode === 200) {
        baseip = "http://**.***.**.35:8048/TESTDEV02/ODataV4/Company('*******')";
      } else {
        get(
          "username",
          "password",
          "http://**.***.**.36:8048/TESTDEV02/ODataV4/Company"
        ).then((response) => {
          if (response.statusCode === 200) {
            baseip = "http://**.***.**.36:8048/TESTDEV02/ODataV4/Company('*******')";
          } else {
            get(
              "username",
              "password",
              "http://**.***.**.37:8048/TESTDEV02/ODataV4/Company"
            ).then((response) => {
              if (response.statusCode === 200) {
                baseip = "http://**.***.**.37:8048/TESTDEV02/ODataV4/Company('*******')";
              }
            });
          }
        });
      }
    })
    console.log(baseip)
  return baseip;
}

module.exports = geturl();


编辑

这是 get() 函数:

const { promisify } = require('util');
var httpntlm = require('httpntlm');
const Logger = require('../../services/error_logger')
const logger = new Logger('app')

module.exports = function (username, password, url) {
    var httpntlmGetAsync = promisify(httpntlm.get);

    return httpntlmGetAsync({
        url: url,
        username: username,
        password: password,
        workstation: '',
        domain: '',
        headers: {
            'Access-Control-Allow-Origin': '*',
            'Accept': '*/*',
            'Content-Type': 'application/json; charset=utf-8'
        }
    })
    .catch(err => logger.error(`URL: ${url}, Error: ${err}`))
    then(response => {
        return response.body
    });
};

【问题讨论】:

    标签: node.js promise


    【解决方案1】:

    看起来您需要在每个 get() 方法之前放置 await。同时你必须将你的函数声明为async:

    async function geturl() { //...
    

    如果没有await,则无论get() 是否返回任何内容,都会执行get() 之后的下一行代码。因此baseip 保留为undefined

    编辑:这是假设您来自 ./functions/functionGETget() 方法是异步的。

    【讨论】:

    • 我收到错误“等待仅在异步函数中有效”。所以不,get() 函数不是异步的……
    • 您可以为您的get() 方法发布代码吗?
    • 是的,我更新了我的问题。谢谢。
    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多