【问题标题】:How to connect my route parameter in express with @mysql/x devAPI?如何将我的路由参数与@mysql/x devAPI 连接起来?
【发布时间】:2020-03-20 00:48:26
【问题描述】:

这是我的代码:

var express = require('express');
var router = express.Router();
var mysqlx = require('@mysql/xdevapi');




router.use(`/:email`, function (req, res, next){
    mysqlx.getSession( {

        user: 'username', 
        password: 'password',
        host: 'localhost', 
        port: '33060' } )

        // .then(session => {
        //   console.log(session.inspect());
        // })

        .then(function (session) {
            var db = session.getSchema('nms2019local');
            var opsTable = db.getTable('operators');
            return opsTable
                .select (['email', 'admin'])
                .where('email like :email')
                .bind('email',':email')
                .execute (function (row) {
                    console.log(row);

                });    
        })
        .then(function (myResult){
            console.log(myResult);

        })
        .catch(function (err){
            console.log(err);
        })

        next()


    });


    router.use('/', function (req, res,){

        res.send('DB Is Connected');

    });

    module.exports = router;

}

我通过邮递员运行以下 GET 命令:

get /expressroutename/email/test@email.com 我在 nodemon 中得到以下信息:

GET /expressroutename/email/test@email.com 200 36.096 ms - 15
{
  getWarnings: [Function: getWarnings],
  getWarningsCount: [Function: getWarningsCount],
  fetchAll: [Function: fetchAll],
  fetchOne: [Function: fetchOne],
  getColumns: [Function: getColumns],
  getResults: [Function: getResults],
  nextResult: [Function: nextResult],
  toArray: [Function: toArray]
}

当我列出 .where 命令时

 //.where('email like :email')

并在我在 nodemon 中得到的 Postman 中输入以下内容:

GET /expressroutename/email 200 45.116 ms - 15
[ 'test@email.com', 1 ]
[ 'test1@email.com', 1 ]
{
  getWarnings: [Function: getWarnings],
  getWarningsCount: [Function: getWarningsCount],
  fetchAll: [Function: fetchAll],
  fetchOne: [Function: fetchOne],
  getColumns: [Function: getColumns],
  getResults: [Function: getResults],
  nextResult: [Function: nextResult],
  toArray: [Function: toArray]

我认为这是一个语法错误,但我已经通过文档多次输入它,但它似乎不起作用。请帮忙。

谢谢

【问题讨论】:

    标签: mysql node.js express mysql-8.0


    【解决方案1】:
    var express = require('express');
    var router = express.Router();
    var mysqlx = require('@mysql/xdevapi');
    
    
    
    
    router.use(`email/:email`, function (req, res, next){
             const email = req.params.email        
    
         mysqlx.getSession( {
    
            user: 'username', 
            password: 'password',
            host: 'localhost', 
            port: '33060' } )
    
            // .then(session => {
            //   console.log(session.inspect());
            // })
    
            .then(function (session) {
                var db = session.getSchema('dbname');
                var TestTable = db.getTable('test');
                return TestTable
                    .select (['email', 'admin'])
                    .where('email like :email')
                    .bind('email', email)
                    .execute (function (row) {
                        console.log(row);
    
                    });    
            })
            .then(function (myResult){
                console.log(myResult);
    
            })
            .catch(function (err){
                console.log(err);
            })
    
            next()
    
    
        });
    
    
        router.use('/', function (req, res,){
    
            res.send('DB Is Connected');
    
        });
    
        module.exports = router;
    

    【讨论】:

      【解决方案2】:

      您使用bind() 的方式似乎有问题。

      基本上,您提供了一个过滤条件'email like :email',其中:email 是一个占位符,应该使用bind() 替换为特定值。但是,您将':email'(特定的String 值)分配给占位符,我怀疑您在operators 表中没有任何行,其中email = ':email'。这就是为什么当您删除过滤条件(由 where() API 指定)时,您会开始获得正确的结果,因为实际上不再应用过滤器。

      所以,如果你想过滤,你需要做的是提供实际的电子邮件地址作为bind() 的第二个参数。我对 Express 有点生疏,但我认为以下方法应该可以解决问题:

      opsTable.select(['email', 'admin'])
        .where('email like :email')
        .bind('email', req.params.email)
      

      注意bind()的第一个参数是不带:(冒号)前缀的占位符名称。

      免责声明:我是 MySQL X DevAPI Connector for Node.js 的首席开发人员

      【讨论】:

      • 是的,这是完美的轻微修改,我必须创建一个常量: const email = req.params.email 然后在绑定行中: .bind('email', email) (无引号) ,我将在下面给出最终答案。
      猜你喜欢
      • 2019-01-09
      • 1970-01-01
      • 2017-03-04
      • 2021-03-15
      • 2015-06-18
      • 2016-05-03
      • 1970-01-01
      • 2017-03-07
      • 2016-09-08
      相关资源
      最近更新 更多