【问题标题】:Stop execution after writing to text file with fs.writeFile使用 fs.writeFile 写入文本文件后停止执行
【发布时间】:2020-12-09 00:01:28
【问题描述】:

我有以下 Node.JS(使用 Express 运行)代码:

let app = express();

app.use(cors());

app.get('/callback', function (req, res) {

    // your application requests refresh and access tokens
    // after checking the state parameter

    var code = req.query.code || null;

    var authOptions = {
        url: 'https://accounts.spotify.com/api/token',
        form: {
            code: code,
            redirect_uri: redirectUri,
            grant_type: 'authorization_code'
        },
        headers: {
            'Authorization': 'Basic ' + (new Buffer(clientId + ':' + clientSecret).toString('base64'))
        },
        json: true
    };

    request.post(authOptions, function (error, response, body) {
            if (!error && response.statusCode === 200) {

                var access_token = body.access_token,
                    refresh_token = body.refresh_token;

                fs.writeFile('test.txt', 'HELLO', function (err) {
                    if (err) return console.log(err);
                    console.log('Hello World > helloworld.txt');
                });
            }
        }
    )
});

console.log('Listening on 8888');
app.listen(8888);

路由用作对 Spotify Web API 请求的回调,因此我可以获得访问令牌。

Spotify 然后重定向到上面的回调函数,你可以通过查看“redirect_uri”在 URI 中看到它。

如果您需要有关 Spotify 授权流程的更多信息,请参阅here

这是我用来向 Spotify 验证我的应用的 URI。

https://accounts.spotify.com/authorize?client_id=CLIENT_ID&response_type=code&redirect_uri=http://localhost:8888/callback&scope=user-read-private%20user-read-email%20playlist-modify-public&state=PexBrjEzISHepTp7&show_dialog=false

在我提出的请求中,CLIENT_ID 被我的真实 CLIENT_ID 替换

我的问题出在文件写入部分:

fs.writeFile('test.txt', 'HELLO', function (err) {
    if (err) return console.log(err);
    console.log('Hello World > helloworld.txt');
});

当 Spotify 调用回调路由时,我的文本文件中写入了字符串“HELLO”,因此文件写入正常。

但是即使它已经完成了字符串的写入,Chrome 页面仍然在服务器上运行并“挂起”。它运行了几分钟,然后说页面没有发送任何数据而崩溃。为什么?

我看过 this page 谈论写入文本文件的方法,使用 writeFile 和 writeFileAsync,但使用它们并没有解决我的问题。

编辑:我真的不想停止 Express 进程!我只是希望能够处理另一个请求:)

有什么想法吗?在此先感谢:)

【问题讨论】:

  • 您需要在请求完成后调用 res.end()。搜索“express end request”是找到答案的一种足智多谋的方式

标签: javascript node.js spotify


【解决方案1】:

您的路线没有返回任何内容,请尝试添加 res.send({})

【讨论】:

    【解决方案2】:

    在您的获取路由中,您没有发送响应,无论写入文件是否成功,您都必须发送响应。

    在写入文件后添加以下代码(以及在错误情况下)

    res.send({YOUR_CHOICE_RESPONSE_DATA})

    【讨论】:

    • 就是这样,非常感谢 :) 它是如此基本......
    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2021-08-18
    • 2019-01-12
    • 2019-11-04
    相关资源
    最近更新 更多