package.json 中的生产脚本找不到模块

Production script in package.json cant find a module

当我 运行 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 是我的 Express 应用程序,它被导出到 Index.js,我在那里连接到 Mongodb。第 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 }))

/* whosebug.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

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

为此,请将 package.json 中的构建命令更改为:

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

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

"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'

一切正常。