动态设置节点获取参数

Set node-fetch parameter dynamically

对于单元测试,我通过 POST 在我的数据库中创建一个新用户,检索 ID 和令牌。之后我想用我刚从第一次获取中收到的 id 令牌删除这个用户。

import fetch from 'node-fetch';

type Response = {
       status: number,
       body: any
};

const response = {} as Response;

someFunction(async () => {

    // Create new user
    await fetch('http://localhost:3000/api/user/register', {
        method: 'POST',
        body: JSON.stringify({email: 'user@test.com', password: 'test-password'}),
        headers: {'Content-Type': 'application/json'}
    }).then(res => {
            res.json().then(json => response.body = json);
        }
    );

    // Delete user just created
    await fetch('http://localhost:3000/api/user/' + response.body.id, {
        method: 'DELETE',
        headers: {
            'Content-Type': 'application/json',
            Authorization: 'Bearer ' + response.body.token
        }
    });
});

第一次获取运行成功 response.body.idresponse.body.token 不为空但是第二次获取总是失败 TypeError: Cannot read property 'id' of undefined

如果有人能指出原因,我将不胜感激。谢谢

发生这种情况的原因是您混淆了一些方法。当您的第一次提取完成时,它将调用第一个 then() 方法。在其中调用响应的 json() 方法并从那里链接承诺。现在第一个 then() 没有得到返回值,所以 fetch 认为它完成了。但实际上你的 res.json() 承诺可能仍然是 运行.

您的第二个 fetch 请求一直在被调用,而 res.json() 仍在解析。这就是为什么值为 undefined.

所以等待第一次获取并存储响应。然后等待 json() 承诺并存储其结果。现在您的线程在没有竞争条件的情况下完成每个步骤。

来自 JSON 响应的值现在将在您的第二个 fetch 请求中可用。

第二个fetch不必使用await。仅当您需要响应中的值并且需要在请求完成时执行某些操作时。

someFunction(async () => {

    // Create new user
    const response = await fetch('http://localhost:3000/api/user/register', {
        method: 'POST',
        body: JSON.stringify({email: 'user@test.com', password: 'test-password'}),
        headers: {'Content-Type': 'application/json'}
    });

    const json = await response.json();

    // Delete user just created
    fetch('http://localhost:3000/api/user/' + json.id, {
        method: 'DELETE',
        headers: {
            'Content-Type': 'application/json',
            Authorization: 'Bearer ' + json.token
        }
    });
});