动态设置节点获取参数
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.id
和 response.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
}
});
});
对于单元测试,我通过 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.id
和 response.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
}
});
});