【问题标题】:Connecting to database in Node.js from routes从路由连接到 Node.js 中的数据库
【发布时间】:2017-07-18 17:43:42
【问题描述】:

我正在使用快速服务器,并且无法从我为用户设置的路由文件访问我的数据库。当我尝试发出获取请求时,我收到此错误消息。

"code": "ER_NO_DB_ERROR", “错误”:1046, "sqlState": "3D000", “索引”:0

我一直在尝试在线寻找解决方案,但大多数答案都建议在任何地方都需要 db.js 文件,而我已经这样做了。我有一种感觉,我需要传递我在 app.js 中建立的连接,但我不知道该怎么做。我的文件的相关部分如下。数据库登录信息已被编辑,我确实在 app.js 中成功连接。我对此相当陌生,因此我们将不胜感激,特别是如果有更好的方法来使用在 db.js 中实现的池。

app.js

      var express = require('express');
      var path = require('path');
      var favicon = require('serve-favicon');
      var logger = require('morgan');
      var cookieParser = require('cookie-parser');
      var bodyParser = require('body-parser');

      var index = require('./routes/index');
      var users = require('./routes/users');
      var mysql = require('mysql')
      var app = express();
      var users = require('./routes/users');
      var media = require('./routes/media');
      var tv = require('./routes/tv');
      var movies = require('./routes/movies');
      var db = require('./db.js')

      var connection = mysql.createConnection({
        port: '3306',
        host: '*********************',
        user: '********',
        password: '******'
       })

      db.connect(function(err) {
        if (err) {
          console.log('Unable to connect to MySQL.')
          process.exit(1)
        } else {
            console.log('Successfully connected')
          }
        })

      app.use('/api', users);

models/user.js

    var db = require('../db.js');
    var passwordHash = require('password-hash');


    exports.getAll = function(done) {
      db.get().query('SELECT * FROM users', function (err, rows) {
        if (err) return done(err)
        done(null, rows)
      })
    }

路由/users.js

    var express = require('express');
    var router = express.Router()
    var user = require('../models/user');
    var db = require('../db.js');

    //this doesn't prInt anything currently. This is prompting me to believe I         somehow         
    //need to pass a connection object or am using the pool properly.
    console.log(db.get());

    router.route('/users').get(function(req, res) {
      user.getAll(function(err, users) {
        if (err) {
           return res.send(err);
         }
         res.json(users);
       });
    });

db.js

//这主要来自我在网上找到的一个教程

    var mysql = require('mysql')
      , async = require('async')

    var PRODUCTION_DB = 'app_prod_database'
      , TEST_DB = 'app_test_database'

    exports.MODE_TEST = 'mode_test'
    exports.MODE_PRODUCTION = 'mode_production'

    var state = {
      pool: null,
      //mode: null,
    }

    exports.connect = function(done) {
      state.pool = mysql.createPool({
        port: '3306',
        host: '***************',
        user: '*********',
        password: '*******'
        //database: mode === exports.MODE_PRODUCTION ? PRODUCTION_DB : TEST_DB
      })

      //state.mode = mode
      done()
    }

    exports.get = function() {
      return state.pool
    }

    exports.fixtures = function(data) {
      var pool = state.pool
      if (!pool) return done(new Error('Missing database connection.'))

      var names = Object.keys(data.tables)
      async.each(names, function(name, cb) {
        async.each(data.tables[name], function(row, cb) {
          var keys = Object.keys(row)
            , values = keys.map(function(key) { return "'" + row[key] + "'" })

          pool.query('INSERT INTO ' + name + ' (' + keys.join(',') + ') VALUES         (' + values.join(',') + ')', cb)
        }, cb)
      }, done)
    }

    exports.drop = function(tables, done) {
      var pool = state.pool
      if (!pool) return done(new Error('Missing database connection.'))

      async.each(tables, function(name, cb) {
        pool.query('DELETE * FROM ' + name, cb)
      }, done)
    }

【问题讨论】:

    标签: mysql node.js database express routes


    【解决方案1】:

    在 createConnection 中提供一个有效的数据库...

    var connection = mysql.createConnection({
        port: '3306',
        host: '*********************',
        user: '********',
        password: '******',
        database: 'mydatabase'
    

    和/或,用查询中的数据库名称限定表名:

       db.get().query('SELECT * FROM mydatabase.users',
                                     ^^^^^^^^^^^
    

    当前代码中发生的情况是,与 MySQL 服务器建立了连接。但是没有执行USE mydatabase 语句。当 SQL 语句SELECT ... FROM users 执行时,MySQL 不知道users 应该引用哪个数据库。 (该表可能存在于多个数据库中,其中包含一个名为 users 的表或视图。)

    这就是导致 1046 No database selected 错误的原因。

    【讨论】:

    • 感谢您的回复,我添加了这个,现在得到一个“代码”:“ER_DBACCESS_DENIED_ERROR”,“errno”:1044,这是进步。我将进一步研究为什么我无法从这里正确访问我的表格
    猜你喜欢
    • 2016-11-21
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2018-11-09
    • 2014-11-25
    • 2020-11-04
    相关资源
    最近更新 更多