【问题标题】:Nextjs function not working in cloud serverless function in vercel (formerly known as zeit)Nextjs 函数在 vercel(以前称为 zeit)中的云无服务器函数中不起作用
【发布时间】:2020-09-22 00:15:18
【问题描述】:

我正在尝试查询托管在地图集(免费层)上的 MongoDB。我正在使用 nextjs 构建 api。我尝试在 vercel(以前称为 zeit)中托管它。该代码在本地运行良好。在部署到云(vercel)时,它不起作用。

var MongoClient = require('mongodb').MongoClient;

// serverless function for proverbs of the day
export default async (req, res) => {
  return new Promise((resolve) => {
    let databaseString = process.env.DATABASE_URL;
    MongoClient.connect(
      databaseString,
      { useUnifiedTopology: true },
      async function (err, client) {
        if (err) {
          console.error(err);
          throw err;
        }

        var db = client.db('database_name');

        var start = new Date();
        start.setHours(0, 0, 0, 0);

        var end = new Date();
        end.setHours(23, 59, 59, 999);

        let result;
        try {
          // query 1 : doesn't works
          result = await db
            .collection('proverbs')
            .findOne({ createdAt: { $gt: start, $lt: end } });

          // query 2 : works
          // result = await db.collection('proverbs').findOne({'id': 11 })
        } catch (err) {
          console.error(err);
        } finally {
          client.close();
        }

        res.send(result);
        return resolve();
      },
    );
  });
};

我尝试了两个查询:查询 1 和查询 2

本地 查询 1 和 2 都有效

在vercel云服务器中 查询 1 不起作用 查询2有效

我想让查询 1 工作。我哪里错了?

【问题讨论】:

  • 这可能与运行您的函数的 Vercel 服务器上的时差有关。 “它不起作用”到底是什么意思,你没有得到任何结果?我会通过在生产环境中记录startendresult 来开始调试,并与本地主机进行比较。
  • @MaximOrlov 问题是它没有返回任何结果。

标签: node.js next.js serverless vercel


【解决方案1】:

问题可能来自您的计算机和 Vercel 服务器之间的时区差异。建议尽可能多地使用 UTC 时间以避免此类问题。

在您的情况下,简单地使用 setUTCHours 而不是 setHours 应该会在生产中为您提供与 localhost 相同的结果。

【讨论】:

  • 设置为 setUTCHours 在本地和生产中都不起作用。我不知道,我应该如何调试它。
  • 所以你在 prod 和 local 之间得到了相同的结果?这意味着代码有效:)。至于为什么您没有得到预期的结果,可能是因为您的文档的createdAt 不在查询的日期范围内。检查 MongoDB Atlas 中的这些文档。你是怎么添加谚语的,手动的,导入的,有人可以通过POST添加吗?
  • 没有。我没有得到结果。我使用 nodejs 脚本插入数据。我在本地和生产中使用相同的数据库(托管在图集中)。该查询在生产中不返回任何结果(但它在本地工作)。你真的认为是因为 setHours 吗?
  • setHours 是您在 prod 和 local 之间获得 不同 结果的原因。您现在得到 no 结果的原因仅仅是因为数据库中没有与查询匹配的文档。该代码按预期工作。您需要查看 MongoDB Atlas 中的数据并查看 createdAt 时间戳。
  • 感谢您的帮助。你是对的(部分)。我将更新我在您的帮助下找到的解决方案。请检查我的答案,为什么我无法将您的答案标记为已接受
【解决方案2】:

问题可能来自您的机器和 Vercel 服务器之间的时区差异,正如 @Maxim Orlov 所回答的那样。但我不能赞成他的回答,因为将 setHours 设置为 setUTCHours 并不能解决问题。以下是我发现的:

解决办法

旧:这不起作用

result = await db
            .collection('proverbs')
            .findOne({ createdAt: { $gt: start, $lt: end } });

新:这项工作

result = await db
            .collection('proverbs')
            .findOne({ createdAt: { $gte: start, $lt: end } });

// also using setUTCHours instead of setHour is recommended, since UTC time is used.

说明

我有许多文档具有以下格式的时间戳 - 2020-06-01 00:00:00.000 - 2020-06-02 00:00:00.000 - 很快。

案例 1:为什么代码在本地给出结果?

  1. 本地机器时区设置为 +05:30
  2. 数据使用 UTC 时间存储在 mongodb (atlas) 中,例如 UTC 时间 2020-06-03 00.00.00。
  3. 本地机器时间为 2020-06-03 11:00:00(即 +05:30)
  4. 让 start = new Date.setHours(0,0,0,0) 即 2020-06-02 18:30:00.000
  5. 让 end = new Date.setHours(23, 59, 59, 999) 即 2020-06-03 18:29:59.999
  6. 结果 = 等待数据库 .collection('谚语') .findOne({ createdAt: { $gt: start, $lt: end } });
  7. createdAt (2020-06-03 00:00:00.000) > start (2020-06-02 18:30:00.000) 并 createdAt (2020-06-03 00:00:00.000)

案例 2:为什么代码在生产中没有给出结果(vercel 服务器)?

  1. vercel 机器时区设置为 +00:00
  2. 数据使用 UTC 时间存储在 mongodb (atlas) 中,例如 UTC 时间 2020-06-03 00.00.00。
  3. vercel 机器时间为 2020-06-03 05:30:00(即 +00:00 即 UTC)
  4. 让 start = new Date.setHours(0,0,0,0) 即 2020-06-03 00:00:00.000
  5. 让 end = new Date.setHours(23, 59, 59, 999) 即 2020-06-03 23:59:59.999
  6. 结果 = 等待数据库 .collection('谚语') .findOne({ createdAt: { $gt: start, $lt: end } });
  7. createdAt (2020-06-03 00:00:00.000) > start (2020-06-03 00:00:00.000) 和 createdAt (2020-06-03 00:00:00.000)

注意:

  • 服务器时间设置为 UTC
  • 因此 setHour 和 setUTCHour 将给出相同的时间
  • 为避免您的计算机和 Vercel 服务器之间的时区差异问题,请始终使用 UTC

【讨论】:

  • 我想你的意思是在第一个例子中说$gt。很高兴你发现了这个问题??
猜你喜欢
  • 1970-01-01
  • 2021-06-13
  • 2020-12-18
  • 1970-01-01
  • 2020-05-31
  • 2021-03-25
  • 2020-09-10
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多