【问题标题】:Production script in package.json cant find a modulepackage.json 中的生产脚本找不到模块
【发布时间】:2021-10-09 16:53:15
【问题描述】:

当我运行npm run prod 时,我得到了错误:

我的 package.json 脚本如下:

    "scripts": {
    "build": "npm run clean && babel src/index.js --out-dir dist --copy-files",
    "clean": "rm -rf dist",
    "test": "jest --coverage --watch",
    "start": "babel-node — exec src/index.js",
    "dev": "nodemon  — exec babel-node src/index.js",
    "prod": "node dist/index.js"

我的目录结构:

dist/
 index.js // the compiled file
node_modules
src/
  /config
  /controllers
  /dao
  /middlewares
  /routes
  /services
 index.js
 server.js

Server.js 是我的快速应用程序,它被导出到我连接到 Mongodb 的 Index.js。第 9 行,如编译后的 Index.js 的错误堆栈中所述:

var app = require('./server'); // not being found

我不确定为什么找不到依赖项。下面是 index.js:

require('dotenv').config()
const app = require('./server')
const chalk = require('chalk')
const OrdersDAO = require('./dao/ordersDAO')
// module to connect to MongoClient
const { MongoClient } = require('mongodb')
const uri = process.env.MONGODB_CONN_STR

const client = new MongoClient(uri, {
  useNewUrlParser: true,
  poolSize: 50,
  useUnifiedTopology: true,
})

const connectToMongoDB = async () => {
  try {
    const conn = await client.connect()
    const orders = conn
      .db(process.env.DATABASE)
      .collection(process.env.COLLECTION)
    await OrdersDAO.injectDB(client)
    await listDatabases(client)
    app.listen(process.env.PORT, () => {
      console.log(`listening on port ${process.env.PORT}`)
    })
  } catch (e) {
    console.error(`Index.js ~~~ Unable to get database.collection: ${e}`)
    // Exit Gracefully ~~~ https://nodejs.dev/learn/how-to-exit-from-a-nodejs-program
    process.on('SIGTERM', () => {
      server.close(() => {
        console.log('Process terminated')
      })
    })
  } finally {
    //  when uncommented ~~~ OrdersDAO.addOrder() ~~~ Unable to post order:) MongoError: Topology is closed, please connect
    // console.log(chalk.magentaBright('Mongo Connection is closing ~~~~'))
    // await client.close()
  }
}

const listDatabases = async (client) => {
  try {
    const dbList = await client.db().admin().listDatabases()
    console.log(chalk.magentaBright('Databases:'))
    dbList.databases.forEach((db) => {
      console.log(chalk.greenBright(` - ${db.name}`))
    })
  } catch (error) {
    console.error(error)
  }
}

connectToMongoDB()

server.js

onst express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors')
require('dotenv').config()
const orders = require('./routes/orders')

const app = express()

// http://expressjs.com/en/4x/api.html#express.urlencoded
app.use(cors())
app.use(express.urlencoded({ extended: true }))

/* stackoverflow.com/questions/24330014/bodyparser-is-deprecated-express-4
parse the incoming requests with JSON payloads */
app.use(express.json())

// Register api routes
app.use('/', orders) //(req, res) => res.send(console.log('Time:', Date.now())))
app.use('/admin/', orders)
app.use('/admin/:id', orders)
/*
TODO - fall through route handler
*/
// app.use("*", (req, res) => res.status(404).json({ error: "not found" }));

module.exports = app

【问题讨论】:

  • 如果编译后的文件低一级,则需要使用../。我可能会考虑改用__dirnamepath.resolve
  • 我应该在 index.js 中哪里使用 __dirname 和 path.resolve?我已经可以看到下一个错误是找不到('./dao/ordersDAO')。 @evolutionbox 我进行了编辑以添加文件。
  • 可能类似于path.resolve([__dirname, 'server.js'])
  • 这就是我所做的,这可能是完全错误的和 hacky。我将构建脚本更改为:"build": "npm run clean && babel ./src --out-dir dist --copy-files" 我使用 ./src 而不是 index.js,而是编译了整个 src 文件夹。我运行 npm run build script 然后 npm run prod。下一个错误是:再生器运行时错误:`/Users/kevinturney/Vue/cookie_mvp_next/cookie_server/dist/dao/ordersDAO.js:30 var injectDB = _asyncToGenerator( /*#__PURE_*/regeneratorRuntime .mark(function _callee(clientConnection) { ^
  • 这也是一种有效的方法。考虑将其添加为答案?

标签: javascript node.js package.json npm-scripts


【解决方案1】:

看来您必须构建整个 src 文件夹,而不仅仅是 index.js 这样做,然后你会在 dist 文件夹中看到 index.js 和 server.js 文件。

要实现这一点,请将 package.json 中的构建命令更改为:

npm run clean && babel src --out-dir dist --copy-files

【讨论】:

    【解决方案2】:

    解决方案是将构建脚本修改为:

    "build": "npm run clean && babel ./src --out-dir dist --copy-files",
    

    之后,根据我在 package.json 中的依赖关系,我遇到了再生器运行时错误:

    
    /Users/kevinturney/Vue/cookie_mvp_next/cookie_server/dist/dao/ordersDAO.js:30 var injectDB = _asyncToGenerator( /*#__PURE_*/regeneratorRuntime.mark(function _callee(clientConnection) { ^ – 
    
    

    然后我 npm 安装了 regenrator-runtime 和 core-js,见Dev.to 文章。最后,我将它们导入 index.js。

    最后一点,在 index.js 上运行测试时,我没有定义 regenerator-runtime,所以在 /tests/indes.spec.js 中,我导入了它:

    import 'regenerator-runtime/runtime'

    一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2020-10-09
      • 2017-01-09
      • 2023-01-23
      • 2020-09-28
      • 2020-01-18
      • 2016-12-16
      相关资源
      最近更新 更多