gpt4 book ai didi

javascript - Node.JS 和 Express res.redirect() 未启用新网页

转载 作者:行者123 更新时间:2023-12-02 21:39:26 24 4
gpt4 key购买 nike

我正在尝试将变量保存到文本文件,但如果使用 spotifyApi.clientCredentialsGrant() 时找不到该变量,那么我希望我的服务器重定向到 app.get('/error', function(req, res) {}); 显示不同的网页,但返回错误:

(node:11484) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

如何解决此错误以显示网页 error.html?

我无法访问 EJS 或 window.location,因为它与其他文件冲突,而且它分别是一个 Node.js 程序。

app.get('/', function (req, res) {
res.sendFile(path.join(__dirname, '/public', 'homepage.html'));
try {
spotifyApi.clientCredentialsGrant()
.then(function (data) {
// Save the access token so that it's used in future calls
client_cred_access_token = data.body['access_token'];
console.log(client_cred_access_token);
console.log('Client Credentials Success!');
}, function (err) {
console.log('Something went wrong when retrieving an access token', err.message);
throw err;

});
fs.writeFile("./public/client_cred_token.txt", '', function (err) {
console.log('Clearing previous access token');
});
fs.writeFile("./public/client_cred_token.txt", client_cred_access_token, function (err) {
if (err) return console.log(err);
});
fs.readFile('./public/client_cred_token.txt', function (err, data) {
if (err) throw err;
console.log("Saved Client Credentials as: %s", data)
});
}
catch (err) {
res.redirect('/error');
}
});

从已接受的答案中得出的关键结论是,在确认需要哪个 HTML/文件之前,不要向服务器发送任何 HTML/文件。

最佳答案

您首先调用 res.sendFile(),然后如果稍后出现错误,您还会调用 res.redirect('/error'),这意味着您将尝试向一个 http 请求发送两个响应,这会触发您看到的错误。你不能这样做。

解决方案是在所有其他操作结束时调用 res.sendFile() ,以便您可以在成功时调用它并调用 res.redirect()当出现错误时,只调用其中之一。

与此处的其他答案不同,我向您展示了如何使用异步文件 I/O 正确编码,以便该设计可以在旨在满足多个用户需求的真实服务器中使用。

const fsp = require('fs').promises;

app.get('/', async function (req, res) {
try {
let data = await spotifyApi.clientCredentialsGrant();
// Save the access token so that it's used in future calls
client_cred_access_token = data.body['access_token'];
console.log(client_cred_access_token);
console.log('Client Credentials Success!');
await fsp.writeFile("./public/client_cred_token.txt", client_cred_access_token);
let writtenData = await fsp.readFile('./public/client_cred_token.txt');
console.log("Saved Client Credentials as: %s", writtenData);
res.sendFile(path.join(__dirname, '/public', 'homepage.html'));
} catch (err) {
console.log(err);
res.redirect('/error');
}
});

关于javascript - Node.JS 和 Express res.redirect() 未启用新网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60404735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com