Here is my first file:

var self = this;
var config = {
    'confvar': 'configval'
};

I want this configuration variable in another file, so I have done this in another file:

conf = require('./conf');
url = conf.config.confvar;

But it gives me an error.

TypeError: Cannot read property 'confvar' of undefined

What can I do?

推荐答案

Edit (2020):

Since Node.js version 8.9.0, you can also use ECMAScript Modules with varying levels of support. The documentation.

  • For Node v13.9.0 and beyond, experimental modules are enabled by default
  • For versions of Node less than version 13.9.0, use --experimental-modules

Node.js will treat the following as ES modules when passed to node as the initial input, or when referenced by import statements within ES module code:

  • Files ending in .mjs.
  • Files ending in .js when the nearest parent package.json file contains a top-level field "type" with a value of "module".
  • Strings passed in as an argument to --eval or --print, or piped to node via STDIN, with the flag --input-type=module.

Once you have it setup, you can use import and export.

Using the example above, there are two approaches you can take

./sourceFile.js:

// This is a named export of variableName
export const variableName = 'variableValue'
// Alternatively, you could have exported it as a default. 
// For sake of explanation, I'm wrapping the variable in an object
// but it is not necessary. 
// You can actually omit declaring what variableName is here. 
// { variableName } is equivalent to { variableName: variableName } in this case. 
export default { variableName: variableName } 

./consumer.js:

// There are three ways of importing. 
// If you need access to a non-default export, then 
// you use { nameOfExportedVariable } 
import { variableName } from './sourceFile'
console.log(variableName) // 'variableValue'

// Otherwise, you simply provide a local variable name 
// for what was exported as default.
import sourceFile from './sourceFile'
console.log(sourceFile.variableName) // 'variableValue'

./sourceFileWithoutDefault.js:

// The third way of importing is for situations where there
// isn't a default export but you want to warehouse everything
// under a single variable. Say you have:
export const a = 'A'
export const b = 'B'

./consumer2.js

// Then you can import all exports under a single variable
// with the usage of * as:
import * as sourceFileWithoutDefault from './sourceFileWithoutDefault'

console.log(sourceFileWithoutDefault.a) // 'A'
console.log(sourceFileWithoutDefault.b) // 'B'

// You can use this approach even if there is a default export:
import * as sourceFile from './sourceFile'

// Default exports are under the variable default:
console.log(sourceFile.default) // { variableName: 'variableValue' }

// As well as named exports:
console.log(sourceFile.variableName) // 'variableValue

You can re-export anything from another file. This is useful when you have a single point of exit (index.{ts|js}) but multiple files within the directory.

Say you have this folder structure:

./src
├── component
│   ├── index.js
│   ├── myComponent.js
│   └── state.js
└── index.js

You could have various exports from both store.js and my-component.js but only want to export some of them.

./src/component/myComponent.js:

import createState from "./state";
export function example(){ };

./src/component/state.js:

export default function() {}

./src/component/index.js

export { example as default } from "./myComponent";
export * from "./myComponent"

./src/index.js

export * from "./component"

Original Answer:

You need module.exports:

Exports

An object which is shared between all instances of the current module and made accessible through require(). exports is the same as the module.exports object. See src/node.js for more information. exports isn't actually a global but rather local to each module.

For example, if you would like to expose variableName with value "variableValue" on sourceFile.js then you can either set the entire exports as such:

module.exports = { variableName: "variableValue" };

Or you can set the individual value with:

module.exports.variableName = "variableValue";

To consume that value in another file, you need to require(...) it first (with relative pathing):

const sourceFile = require('./sourceFile');
console.log(sourceFile.variableName);

Alternatively, you can deconstruct it.

const { variableName } = require('./sourceFile');
//            current directory --^
// ../     would be one directory down
// ../../  is two directories down

If all you want out of the file is variableName then

./sourceFile.js:

const variableName = 'variableValue'
module.exports = variableName

./consumer.js:

const variableName = require('./sourceFile')

Node.js相关问答推荐

可以删除一个mongodb catch块

关于Node.js中的AES加密库的问题

将图像添加到多个产品的条带 checkout 会话中

在 Nest 项目上运行 Jest 测试时,我的文件无法找到一个在测试之外没有任何问题的模块

为什么我不能将 id 发送到后端并通过 findByIdAndRemove() 删除项目?

express cors request.body formData显示undefined

在 linux mint 上部署 node 应用程序的最简单方法是什么?

Axios 响应循环通过函数只返回第一个映射对象的结果

将环境变量从 GitHub 操作传递到 json

MongoDB Atlas中的聚合触发器不起作用

使用 .pipe(res) 向客户端发送音频不允许您搜索?

为什么我在生产环境中 deproy Next.js 示例项目时 CSS 不起作用?

为什么 req.params.id 返回 undefined未定义?

使用 Socket.io 将客户端连接到服务器

带有加密的nodejs中的SALT和HASH密码

Node.js + Express:应用程序不会开始监听端口 80

AngularJS +sails.js

create-react-app,安装错误(找不到命令)

卸载代码/模块

响应分块时获取整个响应正文?