首页 > 解决方案 > Lambda 函数中的把手“找不到部分包含”

问题描述

我有一个要移植到 AWS Lambda 的快速应用程序。它使用车把作为中间件。我开始遵循本指南:https ://dev.to/brightdevs/how-to-convert-an-express-app-to-aws-lambda--44gc

这和我的代码之间的区别是把手。例如,当我尝试 GET / 时,我得到:

Error: /var/task/views/index.hbs: The partial include could not be found at Object.invokePartial (/var/task/node_modules/handlebars/dist/cjs/handlebars/runtime.js:266:11) at Object.invokePartialWrapper [as invokePartial] (/var/task/node_modules/handlebars/dist/cjs/handlebars/runtime.js:68:39) at Object.eval [as main] (eval at createFunctionContext (/var/task/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js:254:23), <anonymous>:8:28) at main (/var/task/node_modules/handlebars/dist/cjs/handlebars/runtime.js:173:32) at ret (/var/task/node_modules/handlebars/dist/cjs/handlebars/runtime.js:176:12) at ret (/var/task/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js:525:21) at /var/task/node_modules/hbs/lib/hbs.js:63:19 at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:511:3)

我的文件夹结构如下所示: /server.js /views/index.hbs /views/partials/include.hbs

server.js 的相关部分:

const express = require('express'),
    hbs = require('hbs'),
    app = express();

hbs.registerPartials(__dirname +'/views/partials');
app.set('view-engine', 'hbs');

app.get("/", (req, res) => {
    res.render('index.hbs', {});
});

const PORT = process.env.PORT || 8080;

const isInLambda = !!process.env.LAMBDA_TASK_ROOT;
if (isInLambda) {
    const serverlessExpress = require('aws-serverless-express');
    const server = serverlessExpress.createServer(app);
    exports.main = (event, context) => serverlessExpress.proxy(server, event, context)
} else {
    app.listen(PORT, ()=>{
        console.log('Server is up, listening on port ' + PORT);
    });
}

如果我使用 node .\server.js 在本地运行代码,我希望 index.hbs 能够像它一样呈现。相反,我得到了上面粘贴的找不到错误。任何线索表示赞赏。

标签: node.jsexpressaws-lambdahandlebars.js

解决方案


我最终解决了它,但想发布解决方案,因为我花了很多时间处理这个问题并将问题放在一起。

做了什么:需要“express-handlebars”而不是“hbs”。我不知道为什么它不适用于 hbs,但我不想再花时间研究这个。

我希望这对将来的某人有用。


推荐阅读