TL; DR: ¿por qué las importaciones devuelven undefined ? ¿Especialmente para módulos de nodejs nativos como path ?
Tengo una aplicación de prueba muy pequeña , creada con Vite, que tiene un único punto final en el directorio /api . Creé esto solo para jugar con Vite + Vercel.
Solo tengo 2 importaciones de módulos para mi punto final: path y fs-extra . Ambos regresan como undefined . No cannot read join of undefined con el módulo de path , así que envolví todo en un try/catch solo para ver si el punto final responde. Lo hace. Ver mi código a continuación.
import type {VercelRequest, VercelResponse} from '@vercel/node'
import path from 'node:path' // I've also tried 'path'
import fs from 'fs-extra'
export default function handler(req: VercelRequest, res: VercelResponse) {
// Both of these log 'undefined' on my Vercel dashboard for function logs.
console.log('path module:', path)
console.log('fs module:', fs)
try {
// https://vercel.com/guides/how-can-i-use-files-in-serverless-functions
const pathFromProjectRootToFile = '/api/usersData.json'
const usersDataFilePath = path.join( // THIS IS WHERE THE ERROR HAPPENS 🙃
process.cwd(),
pathFromProjectRootToFile
)
const usersData = fs.readJSONSync(usersDataFilePath)
res.json({users: usersData})
} catch (e) {
res.json({error: errorToObject(e as Error)})
}
}
function errorToObject(err?: Error): Record<string, string> | null {
if (!err || !(err instanceof Error)) return null
const obj: Record<string, string> = {}
Object.getOwnPropertyNames(err).forEach(prop => {
const value = err[prop as keyof Error]
if (typeof value !== 'string') return
obj[prop] = value
})
return obj
}
Aparte, en lugar de node:path , también probé solo path , pero lo mismo: undefined . Y tengo fs-extra como dependencia en mi package.json .
Al implementar una aplicación Vite en Vercel y utilizar el directorio /api para un back-end con funciones sin servidor, los módulos de node deben importarse mediante require , no import . La sintaxis de import funciona para tipos y módulos locales . Vea esta respuesta (y conversación) en las discusiones de la comunidad de Vercel.
import type {VercelRequest, VercelResponse} from '@vercel/node'
import localModule from '../myLocalModule'
const path = require('path')
const fsOriginal = require('fs')
const fs = require('fs-extra')
// Rest of the file here...