在节点中收到错误"发送到客户端后无法设置标头.js



我有一个前端和一个服务器-后端,我在其中向后端发送请求以获取一些图书信息。然后后端为这些信息调用API并将其返回给前端。它在第一次请求时都工作得很好。如果我从前端执行另一个请求,它会产生下面的错误。

我怎么做才能使它有可能不断地从前端发出新的请求?

node:internal/errors:478
ErrorCaptureStackTrace(err);
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at new NodeError (node:internal/errors:387:5)
at ServerResponse.setHeader (node:_http_outgoing:644:11)
at ServerResponse.header (/Users/jeff/Documents/myProject/backend/node_modules/express/lib/response.js:794:10)
at ServerResponse.send (/Users/jeff/Documents/myProject/backend/node_modules/express/lib/response.js:174:12)
at ServerResponse.json (/Users/jeff/Documents/myProject/backend/node_modules/express/lib/response.js:278:15)
at file:///Users/jeff/Documents/myProject/backend/controllers/model.js:22:14
at file:///Users/jeff/Documents/myProject/backend/controllers/model.js:63:10
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
code: 'ERR_HTTP_HEADERS_SENT'
}
[nodemon] app crashed - waiting for file changes before starting...

showBooks是前端rest调用的入口点。

export const showBooks = async (req, res) => {
const books = req.body.books;
await getBooksInfo(books, (err, results) => {
if (err) {
res.send(err);
} else {
res.json(results);
}
});
}

然后调用getBooksInfo,循环遍历提供的书籍

const getBooksInfo = async (books, result) => {
let all_books = [];
books.forEach(async (book) => {
if (book.type == "adventure") {
const on_sale = book.meta.sale;
if (on_sale == true) {
let book_authors = book.meta.authors;
try {
for (const i in book_authors) { 
await book_api(book_authors[i].name, (err, results) => {
if (err) {
console.log(err);
} else {
all_books.push(results);
}
});
}
} catch (err) {
console.log(err);
}
}
result(null, { input: all_books });
}
});
}

book_api负责获取外部休息点

的信息
export const book_api = async (author_name, result) => {
try {
const response = await axios.get(`https://book-service.com?author=${author_name}`);

const author_info = response.data.author;

let author = {
"name" : author_info.name,
"website" : author_info.website,
};
result(null, author);
} catch (err) {
result(err, null);
}
};

注意forEach不是为异步操作设计的,请尝试用for (const book of books)...替换books.forEach(async (book) => ...

请注意,在您有console.log(err)的地方,也要放置return type,以便一旦请求完成,它将返回一些结果(true或false)。

相关内容

最新更新