【问题标题】:Can't do queries from another file (connection.query is not a function)无法从另一个文件进行查询(connection.query 不是函数)
【发布时间】:2020-01-25 15:33:51
【问题描述】:

我是 node.js 和数据库的新手。尝试执行 mysql 查询,但我收到此错误TypeError: connection.query is not a function

我正在使用 Node MySQL 2 (https://www.npmjs.com/package/mysql2) 包;

app.js 文件中的连接和查询工作正常,但在另一个文件中会引发该错误。

我的代码有什么问题?

app.js

const chalk = require('chalk');
const debug = require('debug')('app');
const morgan = require('morgan');
const path = require('path');
const mysql = require('mysql2');

const app = express();
const port = process.env.PORT || 3000;

const connection = mysql.createConnection({
  host: '...',
  user: '...',
  password: '...',
  database: '...',
});

connection.connect((err) => {
  if (err) {
    debug(`error connecting: ${chalk.red(err.stack)}`);
    return;
  }

  debug(`connected as id ${chalk.green(connection.threadId)}`);
});

app.use(morgan('tiny'));

app.use(express.static(path.join(__dirname, '/public/')));
app.use('/css', express.static(path.join(__dirname, '/node_modules/bootstrap/dist/css/')));
app.use('/js', express.static(path.join(__dirname, '/node_modules/bootstrap/dist/js/')));
app.use('/js', express.static(path.join(__dirname, '/node_modules/jquery/dist/')));
app.set('views', './src/views');
app.set('view engine', 'ejs');

const nav = [{ link: '/books', title: 'Books' },
  { link: '/authors', title: 'Authors' }];

const bookRouter = require('./src/routes/bookRoutes')(nav);

app.use('/books', bookRouter);
app.get('/', (req, res) => {
  res.render(
    'index',
    {
      nav,
      title: 'Library app',
    },
  );
});

app.listen(port, () => {
  debug(`listening on port ${chalk.green(port)}`);
});

module.exports = connection;

bookRoutes.js

const mysql = require('mysql2');
const debug = require('debug')('app:bookRoutes');

const connection = require('../../app');

const bookRouter = express.Router();

function router(nav) {
  const books = [
    {
      title: 'Nocturna',
      genre: 'Fantasy',
      author: 'Maya Motayne',
      read: false,
    },
    {
      title: 'Finale',
      genre: 'Fantasy',
      author: 'Stephanie Garber',
      read: false,
    },
  ];

  bookRouter.route('/')
    .get((req, res) => {
      connection.query('SELECT * FROM `books`', (error, results) => {
        debug(results);
        res.render(
          'bookListView',
          {
            nav,
            title: 'Library app',
            books,
          },
        );
      });
    });

  bookRouter.route('/:id')
    .get((req, res) => {
      const { id } = req.params;
      res.render(
        'bookView',
        {
          nav,
          title: 'Library app',
          book: books[id],
        },
      );
    });

  return bookRouter;
}

module.exports = router;

编辑:项目树

├── app.js
├── package-lock.json
├── package.json
├── public
|  ├── css
|  |  └── styles.css
|  └── js
└── src
   ├── routes
   |  └── bookRoutes.js
   └── views
      ├── bookListView.ejs
      ├── bookView.ejs
      └── index.ejs

感谢您的帮助。

【问题讨论】:

    标签: javascript mysql node.js express


    【解决方案1】:

    bookRoutes.js

    const mysql = require('mysql2');
    const debug = require('debug')('app:bookRoutes');
    
    const connection = require('./../../app').connection; // identify the exported module
    
    // the rest…
    

    【讨论】:

    • 现在收到此错误TypeError: Cannot read property 'query' of undefined
    • 您确定您的app.js 文件的相对路径是正确的吗?可能需要:./../../app?如果您想编辑您的帖子并添加您的文件夹/文档树,我们可以确认。 (用于快速树打印输出的便捷模块:npmjs.com/package/tree-cli
    • 完成,我在帖子中添加了项目树
    • 很好,谢谢。我确实相信您会想要领先的单节并在您的道路上进行斜线。例如,请参阅我编辑的答案。也不确定您是否仍然需要.connection。自从我使用这种方法以来已经有一段时间了,因为我通常让我的数据库 global 跳过对每个文件执行此操作(请参见此处的示例:github.com/dusthaines/mysqljs_setup_snippet/blob/master/app.js
    • 没有帮助,也尝试删除.connection,但仍然没有运气。我会尝试查看您的链接,谢谢。
    猜你喜欢
    • 2020-12-21
    • 2017-09-19
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多