获取未捕获的类型错误:fs.readdirSync 在使用 Browserify 和 Nutritionix NodeJS 客户端库时不是一个函数

Posted

技术标签:

【中文标题】获取未捕获的类型错误:fs.readdirSync 在使用 Browserify 和 Nutritionix NodeJS 客户端库时不是一个函数【英文标题】:Getting Uncaught TypeError: fs.readdirSync is not a function when using Browserify with Nutritionix NodeJS client library 【发布时间】:2016-04-16 14:38:33 【问题描述】:

我正在尝试使用 Node 构建演示应用程序,但在尝试使用 Nutrionix NodeJS 客户端库时,我不断收到 Uncaught TypeError: fs.readdirSync is not a function 错误 (https://github.com/nutritionix/nodejs-client-library)和浏览器化。

我正在关注本教程 http://www.sitepoint.com/getting-started-browserify/ 直到 使用 Browserify 输出 部分,但我没有使用 Underscore 和为 main.js 提供的代码,而是使用 Nutritionix NodeJS 客户端库和 main.js 中的以下代码:

var NutritionixClient = require('nutritionix');

var nutritionix = new NutritionixClient(
    appId: '7c710fbd',
    appKey: 'a2f106128aa4b2ab81fd783fca5bf0ee'
    // debug: true, // defaults to false
);

我使用 Jade 的 html 如下:

doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    block content
    script(src='javascripts/nutri.js')
    script(src='javascripts/main.js')

我在命令行中使用以下内容通过 Nutritionix 构建一个新的 JavaScript 文件:

browserify public/javascripts/main.js -o public/javascripts/nutri.js

当我在本地运行时,在控制台中,我在 nutri.js 的第 465 行收到 Uncaught TypeError: fs.readdirSync is not a function,这是 Browserify 制作的文件。该行是以下函数中的第四行:

function readDirp(path, excludeList) 
    var lib = ;
    var expand = new Expander(path);
    var files = fs.readdirSync(path).map(expand);

    files.forEach(function(file)
        if (excluded(file.name, excludeList) === false) 
            lib[file.name.split('.').shift()] = require(file.location);
        
    );

    return lib;

我不确定为什么我不断收到此错误。当我浏览我在顶部链接的 Browserify 教程时,让 Browserified 文件工作没有问题。如果需要我提供更多信息,请告诉我,非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

使用brfs,https://github.com/browserify/brfs

fs.readFileSync() 和 fs.readFile() 静态资源 browserify 转换

此模块是 browserify 的插件,用于解析 AST 以进行 fs.readFileSync() 调用,以便您可以将文件内容内联到您的包中。

尽管这个模块是为 browserify 使用的,但它并没有特别针对 browserify,所以它应该在其他项目中通常有用。

【讨论】:

但是它将文件内容内联到您的包中,因此可能会产生意外结果...【参考方案2】:

fs 是用于文件系统操作的低级 API,您不能像那样浏览它。您必须提供替代品,例如:https://github.com/mafintosh/browserify-fs。由于您无法从浏览器访问客户端的文件系统,browserify-fs 使用 LevelDB 来模拟一个文件系统。

【讨论】:

我遵循了 browserify-fs README 所说的内容。我使用 npm install browserify-fs 安装了 browserify-fs 并在 nutri.js 中找到 var fs = require('fs');并将其替换为 var fs = require('browserify-fs');。但是当我在本地启动我的应用程序时,我得到了 Uncaught Error: Cannot find module 'browserify-fs' on the first line of nutri.js【参考方案3】:

虽然这是一种意见......

首先,Nutrionix NodeJS Client Library 设计用于Node.js 运行时,而不是在浏览器(chrome、firefox 和其他)运行时中使用。

也许Client 并不意味着browser,而是意味着像who use Nutrionix by Node.js。所以,错误信息是正确的。

第二,ShanShan的建议在like的情况下也是正确的,但在alejandroj1234的情况下,似乎不正确。 因为browserify-fs不支持readdirSync方法。

例如,我替换了fs模块和browserify-fs,但仍然出现错误消息。(它在lib-loader模块中使用,由nutrionix模块使用)

所以我的结论是,您使用browserify 的方式是正确的,但它的库不适合以防万一。

【讨论】:

以上是关于获取未捕获的类型错误:fs.readdirSync 在使用 Browserify 和 Nutritionix NodeJS 客户端库时不是一个函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 node.js 中捕获同步函数中的错误?

未捕获的类型错误:无法读取未定义的属性“获取”

获取未捕获的类型错误:无法读取未定义的属性“toLowerCase”[关闭]

获取未捕获的类型错误 DataTable() 不是函数

控制台显示未捕获的类型错误

获取未捕获的类型错误:path.split 不是反应中的函数