我正在使用node.js来创建一个Web应用程序。当我运行应用程序时(通过在浏览器上打开index.html或使用命令" npm start"在终端上)我得到两个错误:
未捕获的ReferenceError:未定义过程
未捕获的ReferenceError:未定义require
我解决了"要求未定义"错误,特别是在我的index.html头标记中包含this脚本的链接,其中定义了require函数。 但是,我找不到类似于过程函数的东西。
我的问题是双重的:
为什么需要重新定义内置的node.js模块?为什么他们不被认可,那就是"内置模块"?不是术语"内置模块"是指模块不需要外部/第二次重新定义?
有没有办法解决这个问题?我的脚本非常简单,我只是想尝试使用node.js的基本功能,所以我无法弄清楚我可能做了哪些错误。
如果有人遇到这个问题,并找到了解决问题的方法,或者出现这种情况的原因,那么你将会有很大的帮助。
答案 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
对象添加一些内容以使其在浏览器中可用:
'development'
中使用库的所有环境变量
dotenv'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 密钥的人都可以看到它们。