首页 > 解决方案 > 使用 Netlify 函数加载本地文件

问题描述

我编写了一个脚本,它接受一个 JSON 文件并使用 Netlify 的Functions功能(https://functions.netlify.com/)将其输出到 API 端点。在大多数情况下,这可以顺利工作,但是,我的一个端点有很多文本,为了便于编辑,我将大文本块拆分为 markdown 文件,然后将其加载到端点中。

在本地,这工作得很好,但是在部署时我得到一个控制台错误,说Failed to load resource: the server responded with a status of 502 (). 我认为这是因为我使用了节点fs方法,而 Netlify 不允许这样做,但是,我找不到任何有关此的信息。

我使用的代码在这里:

const marked = require('marked')
const clone = require('lodash').cloneDeep
const fs = require('fs')
const resolve = require('path').resolve
const data = require('../data/json/segments.json')

// Clone the object
const mutatedData = clone(data)

// Mutate the cloned object
mutatedData.map(item => {
  if (item.content) {
    const file = fs.readFileSync(resolve(`./src/data/markdown/${item.content}`), 'utf-8')
    item.content = marked(file)
  }
})

exports.handler = function(event, context, callback) {
  callback(null, {
    statusCode: 200,
    body: JSON.stringify({data: mutatedData})
  });
}

我也尝试过更换

  const file = fs.readFileSync(resolve(`./src/data/markdown/${item.content}`), 'utf-8')

  const file = require(`../data/markdown/${item.content}`)

但这抱怨加载程序,如果可能的话,我想避免在我使用时添加 webpack 配置create-react-app,此外,我怀疑它是否会有所帮助,因为我仍然会在构建时间之后访问文件系统。

有没有其他人遇到过这个问题?

标签: javascriptnode.jsnetlify

解决方案


在编写此答案时(2019 年 9 月),Netlify 似乎没有将辅助文件上传到 AWS Lambda,似乎只会handler上传导出的脚本。即使您有多个脚本导出多个处理程序,Netlify 似乎也会将它们上传到隔离的“容器”(不同的 AWS 实例)中,这意味着脚本将无法在相对路径中看到彼此。免责声明:我只使用免费帐户进行了测试,可能存在我不知道的设置。

解决方法:

对于辅助脚本,将它们制作成NPM包,添加到package.jsonrequire脚本中。它们将被安装并可供使用。

对于静态文件,您可以像在拥有 AWS Lambda 之前一样将它们托管在 Netlify 上,并发出http请求以获取主脚本中的文件。


推荐阅读