【问题标题】:how to configure the __dirname to point to project directory in node?如何配置 __dirname 指向节点中的项目目录?
【发布时间】:2020-04-25 20:49:49
【问题描述】:

我正在向我的节点项目添加续集,它将以下 index.js 文件添加为设置的一部分,但是当我运行项目时,__dirname 解析为我的 C: 目录而不是项目根文件夹 C:\工作区\我的应用程序。如何配置它以使其解析为我的项目根目录?

index.js 文件

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs.readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

package.json

{
  "name": "my-app-model",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"",
    "start": "next start",
    "type-check": "tsc"
  },
  "dependencies": {
    "@material-ui/core": "^4.8.3",
    "@material-ui/lab": "4.0.0-alpha.39",
    "mysql": "^2.18.1",
    "mysql2": "^2.1.0",
    "next": "9.1.7",
    "prettier": "^1.19.1",
    "react": "16.12.0",
    "react-dom": "16.12.0",
    "sequelize": "^5.21.7",
    "sequelize-cli": "^5.5.1"
  },
  "devDependencies": {
    "@types/node": "^13.1.6",
    "@types/react": "^16.9.17",
    "@types/react-dom": "^16.9.4",
    "typescript": "^3.7.4"
  }
}

【问题讨论】:

  • 取决于你如何运行项目。
  • @Anatoly - 谢谢。那我应该怎么运行呢?
  • __dirname 是您作为入口点运行的脚本的路径。检查你如何运行它以及从哪里运行它
  • 好的。从 package.json 显示你的“运行”命令
  • 也许 'next' 正在以 c:\ 作为工作目录运行?

标签: node.js sequelize.js


【解决方案1】:

我认为直接的解决方案是将__dirname 替换为以下内容:

const modelsDir = path.resolve(process.cwd(), 'path/to/models')
fs.readdirSync(modelsDir)
  .filter(....

__dirname 以我们期望的方式工作是在 next.js 上使用known issue

我希望 __dirname 是执行 getStaticProps 的文件的绝对路径,但它却错误地解析为 /。

以下是改写为功能请求的问题:https://github.com/vercel/next.js/issues/8251

如果这有助于某人找到此解决方案,请提供一些背景知识:

我使用的是 Mac,但遇到了非常相似的问题。我正在使用 sequelize 设置 next.js 应用程序。在我运行 sequelize-cli 生成您上面引用的 models/index.js 后,我首先看到了这个错误:

Error: Cannot find module '/Applications'
Require stack:
- /Users/username/src/mariner-next/node_modules/sequelize/lib/sequelize.js
- /Users/username/src/mariner-next/node_modules/sequelize/index.js
- /Users/username/src/mariner-next/.next/server/static/development/pages/api/graphql.js
- /Users/username/src/mariner-next/node_modules/next/dist/next-server/server/next-server.js
- /Users/username/src/mariner-next/node_modules/next/dist/server/next.js
- /Users/username/src/mariner-next/node_modules/next/dist/server/lib/start-server.js
- /Users/username/src/mariner-next/node_modules/next/dist/cli/next-dev.js
- /Users/username/src/mariner-next/node_modules/next/dist/bin/next
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:981:15)
    at Function.Module._load (internal/modules/cjs/loader.js:863:27)
    at Module.require (internal/modules/cjs/loader.js:1043:19)
    at require (internal/modules/cjs/helpers.js:77:18)
    at Sequelize.import (/Users/username/src/mariner-next/node_modules/sequelize/lib/sequelize.js:481:62)
    at eval (webpack-internal:///./tnr/lib/models/index.js:60:36)
    at Array.forEach (<anonymous>)
    at Module.eval (webpack-internal:///./tnr/lib/models/index.js:58:4)

经过一番摸索,我意识到__dirname 被设置为"/",所以fs.readdrSync(__dirname) 正在返回我的根目录列表。

【讨论】:

    【解决方案2】:

    我已经成功使用rootrequire(存档以支持 ES6 模块):https://github.com/ericelliott/rootrequire

      const root = require('rootrequire'); // project root path
      const myLib = require(`${root}/path/to/lib.js`);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2013-09-06
      相关资源
      最近更新 更多