我的无服务器函数偶尔会在 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 并添加日志,然后重新加载本地主机,我又回到了之前描述的停滞行为。