停滞或不存在的 Netlify 无服务器功能响应

问题描述 投票:0回答:0

我的无服务器函数偶尔会在 14-30 秒的长时间延迟后响应,但大多数情况下它只是停止而没有响应。这是在将我的语法从 CommonJS 转移到 ESModules 后不久发生的。

在我浏览器的网络选项卡中,请求停留在初始连接阶段:

我已经尝试配置我的 Netlify.toml 文件以使用 esbuild 节点捆绑器,并将我的导入(jsonwebtoken、mongodb 和 bcrypt)定义为外部节点模块。如前所述,这最初使函数再次运行,但很快又停止了。停止后,函数文件 (auth.js) 中的所有代码都不会运行,即使我将它编辑成样板处理程序导出:

export const handler = async function(event, context) {
   console.log('never runs')
   return { statusCode: 400 }
}

我有另一个似乎运行良好的无服务器函数;问题主要出在这个功能上。

auth.js(位于 netlify/functions/auth/auth.js):

import { MongoClient } from 'mongodb'
import { mongoConfig } from '../config'

const { URI, DATABASE, USER_COLLECTION, SESSION_SECRET } = process.env,
  clientPromise = new MongoClient(URI, mongoConfig)

export const handler = async function (event, context) {
  const { httpMethod } = event,
    { username, password } = JSON.parse(event.body)

  if (httpMethod !== 'POST')
    return {
      statusCode: 404,
      body: JSON.stringify({ error: 'not found' }),
    }

  if (!username || !password)
    return {
      statusCode: 400,
      body: JSON.stringify({ error: 'missing username or password fields' }),
    }

  try {
    const database = (await clientPromise).db(DATABASE),
      collection = database.collection(USER_COLLECTION),
      adminUser = await collection.findOne({ username })

    await clientPromise.close()

    const bcrypt = await import('bcrypt')
    if (adminUser === null || !bcrypt.compareSync(password, adminUser.password))
      return {
        statusCode: 401,
        body: JSON.stringify({
          error: 'incorrect username or password',
        }),
      }

    const jwt = await import('jsonwebtoken'),
      token = jwt.sign(
        {
          username,
        },
        SESSION_SECRET,
        {
          expiresIn: '24h',
        }
      )

    return {
      statusCode: 200,
      headers: {
        'set-cookie': `jwt=${token}; secure; httpOnly; sameSite=Lax`,
      },
      body: JSON.stringify({
        username,
        token,
      }),
    }
  } catch (error) {
    console.error(error)

    return {
      statusCode: 500,
      body: JSON.stringify({
        serverError: error.toString(),
      }),
    }
  }
}

编辑:每当 auth 函数响应时,通常在我重新启动服务器后,这是收到的响应:

如果我在动态导入 JWT 后尝试进入 auth.js 并添加日志,然后重新加载本地主机,我又回到了之前描述的停滞行为。

javascript vite serverless netlify preact
© www.soinside.com 2019 - 2024. All rights reserved.