【问题标题】:I have a function that returns an Object's key, however I need to access the original Object from this value: Javascript我有一个返回对象键的函数,但是我需要从此值访问原始对象:Javascript
【发布时间】:2021-06-22 04:04:37
【问题描述】:

这是我第一次发帖。

我有以下功能:

export function sendRequest<T>(req: RawRequest, options) {
    const start = Date.now();
    const reqOptions: CoreOptions = {
        headers: {...req.headers, ['Content-type']: 'application/json'},
        body: req.body,ִ

    };

    if (options.ignoreCertError) {
        process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0 as any;
    }

    if (options.proxy) {
        reqOptions.proxy = options.proxy;
        reqOptions.tunnel = false;
    }

    return new Promise<T>((resolve, reject) => request[req.method](
        req.uri, reqOptions, (error: any, response: Response, body: any) => {
            if (error) {
                reject({
                    errorCode: error.errno ?? 'unknown',
                    errorDetails: error.syscall == 'getaddrinfo' ? 'missing vpn connection?' : error,
                });
                return;
            }
            try {
                resolve(JSON.parse(body));
            } catch (ex) {
                reject({error: ex, body});
            }
        }));
} 

如您所见,当这个 Promise 解决时,我会从请求的响应中返回正文。

但是,我需要以某种方式访问​​完整的响应,以便可以访问标头。

我无法更改此功能 - 项目中的所有 API 调用都使用它

我需要访问响应的函数:

await <my API endpoint that uses the above function>.get({
                        <my params>
                    }).then((res) => {
                        // get the response
                        // get the headers
                        return result = <something I need from the headers>
                    });

我希望这是有道理的,有人可以帮助我吗?

【问题讨论】:

  • 显然,你不能。要么重新设计sendRequest,要么创建一个新函数来返回完整的响应,而不仅仅是它的主体(并重写sendRequest作为新的代理)。

标签: javascript node.js typescript promise response


【解决方案1】:

问题在于您返回的是解析后的 JSON 主体的对象。以下是两种可能的选择:

定义两个属性,一个用于正文,一个用于响应:

try {
  let obj = {
    body: JSON.parse(body),
    response
  };
  resolve(obj);
} catch (ex) {
  reject({error: ex, body});
}

//access it with .response, always enumerable

Define a hidden property 在解析的 body 对象内(不推荐):

try {
  let obj = JSON.parse(body);
  Object.defineProperty(obj, '_response', {value: response});
  resolve(obj);
} catch (ex) {
  reject({error: ex, body});
}

//access it with ._response, not enumerable

【讨论】:

    【解决方案2】:

    假设 options 是一个对象

    export function sendRequest<T>(req: RawRequest, options) {
    const start = Date.now();
    const reqOptions: CoreOptions = {
        headers: {...req.headers, ['Content-type']: 'application/json'},
        body: req.body,ִ
    
    };
    
    if (options.ignoreCertError) {
        process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0 as any;
    }
    
    if (options.proxy) {
        reqOptions.proxy = options.proxy;
        reqOptions.tunnel = false;
    }
    
    return new Promise<T>((resolve, reject) => request[req.method](
        req.uri, reqOptions, (error: any, response: Response, body: any) => {
            if (error) {
                reject({
                    errorCode: error.errno ?? 'unknown',
                    errorDetails: error.syscall == 'getaddrinfo' ? 'missing vpn connection?' : error,
                });
                return;
            }
            try {
                  if ('temp_key_response' in options) {
                        resolve(response);
                    } else {
                        resolve(JSON.parse(body));
                    }
                
            } catch (ex) {
                reject({error: ex, body});
            }
        }));
    } 
    

    当你打电话时

    let options = {temp_key_response:'temp'}
    sendRequest(req,options);
    

    【讨论】:

    • 我不认为response 是 JSON 字符串
    • @DadiBit 我已经更改了代码,但我的意思是你可以在 options 参数中设置一个新的 key: value 并根据新 key: value 是否存在返回响应或正文。
    • 没关系,但也许最好使用resolve_type 选项,将其设置为body(返回解析后的正文)或response(返回正文)。你也可以try/catch 只有JSON.parse 行。一个小的改进也可以是解析返回变量(所以resolve() 只写一次)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多