未捕获的ReferenceError:未定义进程

时间:2015-05-14 13:47:31

标签: javascript node.js process module npm

我正在使用node.js来创建一个Web应用程序。当我运行应用程序时(通过在浏览器上打开index.html或使用命令" npm start"在终端上)我得到两个错误:

未捕获的ReferenceError:未定义过程

未捕获的ReferenceError:未定义require

我解决了"要求未定义"错误,特别是在我的index.html头标记中包含this脚本的链接,其中定义了require函数。 但是,我找不到类似于过程函数的东西。

我的问题是双重的:

  1. 为什么需要重新定义内置的node.js模块?为什么他们不被认可,那就是"内置模块"?不是术语"内置模块"是指模块不需要外部/第二次重新定义?

  2. 有没有办法解决这个问题?我的脚本非常简单,我只是想尝试使用node.js的基本功能,所以我无法弄清楚我可能做了哪些错误。

  3. 如果有人遇到这个问题,并找到了解决问题的方法,或者出现这种情况的原因,那么你将会有很大的帮助。

6 个答案:

答案 0 :(得分:3)

Node.js代码必须由节点进程运行,而不是浏览器运行(代码必须在服务器中运行)。

要运行代码,您必须运行命令:

node server.js

然后,您可以通过键入" http://localhost:8080"来从浏览器访问您的服务器。您必须具有所需服务器代码的文件server.js(或其他)(在本例中,在端口8080中创建Web服务器)。

您可以使用express作为http服务器模块:http://expressjs.com/starter/hello-world.html

,按照这个简单示例

答案 1 :(得分:3)

Webpack 可以将环境变量注入“客户端”.js 代码(在 SPA/PWA 的情况下非常有用)。你应该在 webpack.config.js 中将它们定义为插件

webpack.config.js

module.exports = {
plugins: [
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
      'process.env.MY_ENV': JSON.stringify(process.env.MY_ENV),
      ... and so on ...
    })
],
}

现在您可以在客户端访问它:

app.js

// Something like that
if(process.env.NODE_ENV === 'debug'){
    setDebugLevel(1)
}

答案 2 :(得分:1)

我也遇到了同样的问题,方法是进入我的.eslintrc.js文件 配置我的全局变量,向全局变量添加require和process,并将相应的值设置为等于“可写”。希望它对您有用。

此链接确实有帮助 https://eslint.org/docs/user-guide/configuring#specifying-globals

答案 3 :(得分:0)

当我尝试执行此节点js应用程序时,我遇到了同样的问题:https://www.youtube.com/watch?v=mr9Mtm_TRpw

从<脚本>到达html中的require,并且未定义,例如

<script src="./renderer.js"></script>

我将其更改为:

win = new BrowserWindow({
    width: 800, 
    height:600, 
    icon: __dirname+'/img/sysinfo.png', 
    webPreferences: {
        nodeIntegration: true
    }
});

html脚本中的过程也未定义。我在js文件中包含了webPreferences:nodeIntegration:

@Query("select m from ClubMember m " +
    "where m.student = :#{#student}" +
    "and m.role in :#{#role.getParents()}"
  )
  List<ClubMember> findByRoleWithInheritance(@Param("student") Student student, @Param("role") ClubRole role);

我希望它能帮上忙。

答案 4 :(得分:0)

如果您在 Webpack 3 中使用 npm 模块 dotenv-webpack,那可能是因为您使用了解构,如下所示:

const { ENV1, ENV2 } = process.env;

这是一个 known issue

丑陋的解决方法是:

const { ENV1 } = process.env;
const { ENV2 } = process.env;

答案 5 :(得分:0)

如果您遇到此问题并且正在使用 webpack,则可以通过在 webpack.config.js 中使用 process.env 将所需的 .env 数据注入到客户端包中。

在下面的示例中,我展示了如何向 NODE_ENV 对象添加一些内容以使其在浏览器中可用:

  1. 'development' 中使用库的所有环境变量 dotenv
  2. 'production' 的值,即 # .env API_KEY=taco-tues-123 API_SECRET=secret_tacos // webpack.config.js const dotenv = require('dotenv').config({ path: __dirname + '/.env' }) const isDevelopment = process.env.NODE_ENV !== 'production' module.exports = { plugins: [ new webpack.DefinePlugin({ 'process.env': JSON.stringify(dotenv.parsed), 'process.env.NODE_ENV': JSON.stringify(isDevelopment ? 'development' : 'production'), }), ].filter(Boolean), }

工作示例

// Within client side bundle (React)
// src/App.jsx

console.log(process.env)          // {API_KEY: "taco-tues-123", API_SECRET: "secret_tacos"}
console.log(process.env.NODE_ENV) // development
console.log(process.env)
.env

请注意,NODE_ENV 仅包含来自 process.env 文件的值,并且 process.env 不是 module.exports = { plugins: [ new webpack.DefinePlugin({ 'process.env': { ...dotenv.parsed, 'NODE_ENV': JSON.stringify(isDevelopment ? 'development' : 'production') } }), ].filter(Boolean), } 对象的一部分。

在下面的示例中,我展示了我如何尝试注入导致我发生堆栈溢出的 // Within client side bundle (React) // src/App.jsx console.log(process.env) // Uncaught ReferenceError: taco is not defined console.log(process.env.NODE_ENV) // development 对象。我还包括 webpack 文档中的一个重点,说明为什么下面的代码不起作用。

破碎的例子

'process.env.NODE_ENV': JSON.stringify('production')
process: { env: { NODE_ENV: JSON.stringify('production') } }

来自 webpack DefinePlugin docs

<块引用>

警告定义进程首选值时

dotenv.parsed

结束

import scala.collection.mutable.ListBuffer val databases = spark.catalog.listDatabases.select($"name").collect().map(_(0)).toList var tables= new ListBuffer[String]() databases.foreach{database => val t = spark.catalog.listTables(database.asInstanceOf[String]).filter($"isTemporary" === false).filter($"tableType" =!= "VIEW").select($"name").collect.map(database+"."+_(0).asInstanceOf[String]).toList tables = tables ++ t } tables.foreach(println)

使用后者 将覆盖可能破坏与 一些模块希望进程对象上的其他值是 定义。

!警告!

如上所述将 {{1}} 注入客户端包会将这些机密暴露给客户端。出于开发目的,这没什么大不了的,但在已部署的生产环境中,任何寻找密码或私有 API 密钥的人都可以看到它们。