首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态设置node-fetch参数

动态设置node-fetch参数
EN

Stack Overflow用户
提问于 2020-10-20 03:41:15
回答 1查看 590关注 0票数 0

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

代码语言:javascript
复制
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时,第二次获取始终失败

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-20 03:58:17

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

res.json()仍在解析的同时,您的第二个fetch请求已经被调用了。这就是该值为undefined的原因。

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

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

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

代码语言:javascript
复制
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
        }
    });
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64434133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档