这是 Vercel 错误吗?找不到模块“./model”

Is this a Vercel bug? Cannot find module './model'

我有 2 个文件:

我正在制作一个 express.js 应用。

所以,model.jscontroller.js 中是必需的,但是当我调用 api 时出现此错误

日志是:

但是问题来了,'./model.js'确实存在,但是vercel不认识 并且在本地开发中工作正常,并且是正确需要的

这是model.js

const { nanoid } = require("nanoid");

const getDateStr = () => {
    const now = new Date();
    return `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}`;
}

const Purchase = ({ id_user_buyer, id_user_seller, id_product, quantity }) => (
    {
        id_user_buyer,
        id_user_seller,
        id_product,
        quantity,
        id_purchase: nanoid(),
        date: getDateStr(),
    }
);

module.exports = {
    Purchase
}

这是controller.js

const err = require("../../../utils/error");
const { Purchase } = require("./model")
// others modules and they are well imported, so the problem is './model'
const userController = require("../user");
const productController = require("../product");
const cartController = require("../cart");

const TABLE = 'purchase';

function purchaseController(injectedStore) {
    // example code
    async function makePurchase(data) {
        const purchase = Purchase(data);
        await injectedStore.insert(TABLE, purchase);
    }
    
    return {
        makePurchase,
    }
}

module.exports = purchaseController;

如你所见,model.js在内部导入得很好controller.js我不知道为什么vercel说ERROR Cannot find module './model'我再说一遍,在本地开发中工作正常但在维塞尔

一个快速修复方法是将 model.js 的所有代码复制并粘贴到 controller.js 中 我试过了,我部署了他并且成功了。 如果我只是评论我导入 ./model 的那一行,我的所有应用程序也能正常工作,但显然我的应用程序将停止具有该功能,所以第一个解决方案很丑陋但有效,但那些不是最好的解决方案。最好的解决方案是正确导入文件

奇怪的事实 我尝试重命名文件,但也没有用。如果我导入一个新文件,它也不起作用。

注意 我把 nodejs 版本从 12 改成 14,会不会和它有关系?

以防万一我把我的文件夹结构

根目录

api

这是我的vercel.json

{
    "version": 2,
    
    "builds": [
        {
            "src": "/api/index.js",
            "use": "@vercel/node"
        }
    ],

    "routes": [
        {
            "src": "/api/auth(.*)",
            "dest": "/api/index.js"
        },
        {
            "src": "/api/users(.*)",
            "dest": "/api/index.js"
        },
        {
            "src": "/api/products(.*)",
            "dest": "/api/index.js"
        },
        {
            "src": "/api/cart(.*)",
            "dest": "/api/index.js"
        },
        {
            "src": "/api/purchases(.*)",
            "dest": "/api/index.js"
        },
        {
            "src": "/api/sales(.*)",
            "dest": "/api/index.js"
        }
    ]
}

我不知道这是vercel的错误还是我的错误。我的应用程序目前可以正常工作,但正在执行我之前命名的技巧,即将 model.js 的所有代码放入 controller.js

感谢阅读整期。

嗯,我不知道为什么,但我认为是一个 vercel 错误,我的问题的解决方案是不使用可选链接。

controller.js 中,我有更多代码并且我使用的是 optional chaining,只需更改逻辑即可正常工作。 Vercel 支持可选链接,但使用节点 14.x 并且我在 Vercel 中使用节点 12.x,所以我将其更改为 14.x 并且在其他文件中工作正常,但在 controller.js

因此,如果您正在使用 javascript 新事物,例如可选链接、nullish operator 等。并且您在 vercel 中使用 12.x 版本,则会产生错误。因此,您更改为节点 14.x,它也可能给您带来错误。

因此,您最好从一开始就确保您在 vercel

中拥有 node.js 的 14.x 版本

how to change node version in vercel