lowdb 仅更新 JSON 文件中的一个信息

lowdb updates only one infos in JSON file

我发出 lowdb 请求更新 JSON 文件,但只有日期被更新。当我做一个console.log的信息要更新时,这是我要更新的:

res.on("end", function () {
            let body = Buffer.concat(chunks);
            let final = JSON.parse(body);
            if (final.error !== undefined) {
                console.log("Initial authentication:", final.error_description, "Please refresh the authentication grant");
                extAuthCallback(84);
            } else {
                tokens.set('access_token', final.access_token)
                    .set('expires_in', final.expires_in)
                    .set('refresh_token', final.refresh_token)
                    .set('refresh_date', moment())
                    .write()
                console.log(final, tokens.value())
                extAuthCallback(1);
            }
        });

console.log 我的最终变量:

{
  access_token: 'oa_prod_iq00cRPk5Jhh4VffSHlDj7DEDsSIlpCRRczI3l3ASC0',
  token_type: 'bearer',
  expires_in: 2399,
  refresh_token: 'oa_prod_nIjBZs74xGvJXi1B-wdMyITfxGyklpCRRczI3l3ASC0'
}
请求后我的 JSON 文件的

console.log:

{
  access_token: 'oa_prod_pB9Q0FFM9Tk4c5n3HMRBFKAVz6naiJ-jmb3QCeBrT00',
  expires_in: 2399,
  refresh_token: 'oa_prod_nX3EDs530SM8eHv_fM5BN7-5RLBwkrKoUi6uExBbTY4',
  refresh_date: '2020-11-28T23:31:13.855Z',
  primary_autorization_date: '2020-11-29T00:40:58.421Z'
}

我的JSON文件修改后:

{
  "access_token": "oa_prod_pB9Q0FFM9Tk4c5n3HMRBFKAVz6naiJ-jmb3QCeBrT00",
  "expires_in": 2399,
  "refresh_token": "oa_prod_nX3EDs530SM8eHv_fM5BN7-5RLBwkrKoUi6uExBbTY4",
  "refresh_date": "2020-11-28T23:31:13.855Z",
  "primary_autorization_date": "2020-11-29T00:40:58.421Z"
}

所以只有 primary_autorization_date 字段在变化...

您应该使用 set 而不是 update

tokens.set('access_token', final.access_token)
    .set('expires_in', final.expires_in)
    .set('refresh_token', final.refresh_token)
    .set('refresh_date', moment())
    .write()

更新方法接受了这样的功能。

db.update('test1', (n) => 5555)
  .update('test2', (n) => n + 1)
  .write()

如果使用set,只需要给它赋值即可。

db.set('test1', 5555).set('test2', 3333).write()

当您使用 moment 时,您可以使用两种方法。

// Way 1 with moment()
db.set('date', moment()).write()

// Way 2 with moment
db.update('date', moment).write()

所以解决方案是:

我在另一个文件中调用包含 HTTP 请求的函数,如下所示:

app.get('/', async function(req, res) {
    const access_token = req.query.code;
    if (access_token) {
        let authentication = await asyncExtAuth(access_token);
        if (authentication == 84)
            return res.send({error: "Please give a valid access_token"});
        res.sendFile(path.join(__dirname + '/success_page/index.html'));
        db.set('access_token', access_token).write()
        tokens.set('primary_autorization_date', moment()).write()
        console.log("Access Token successfully refreshed")
    }
    else
        res.send({error: "Please specify an access token"})
})

其中,我用 tokens.set('primary_autorization_date', moment()).write() 行第二次修改我的文件。通过这样做,lowdb 不会考虑之前所做的修改,而是使用之前包含的信息重新修改我的文件。解决方案是在修改文件之前添加行 tokens.read() 以更新缓存:

app.get('/', async function(req, res) {
    const access_token = req.query.code;
    if (access_token) {
        let authentication = await asyncExtAuth(access_token);
        if (authentication == 84)
            return res.send({error: "Please give a valid access_token"});
        res.sendFile(path.join(__dirname + '/success_page/index.html'));
        db.set('access_token', access_token).write()
        tokens.read()
        tokens.set('primary_autorization_date', moment()).write()
        console.log("Access Token successfully refreshed")
    }
    else
        res.send({error: "Please specify an access token"})
})