【问题标题】:How to pull the array object from the MYSQL Dev Api in express?如何从快递中的MYSQL Dev Api中提取数组对象?
【发布时间】:2020-04-09 13:45:12
【问题描述】:

我正在尝试提取对象/数组 myResults,我已经尝试了尽可能多的方法来提取它,但无法做到,有人可以帮忙吗?

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


router.post('/email/:email', function (req, res, next){


let p_email = req.params.email
console.log (p_email)


mysqlx
.getSession( {

    user: 'user', 
    password: 'password',
    host: 'localhost', 
    port: '33060', 
})
.then(function(session) {

    const oracleDb = session.getSchema('nms2019local');

    var myTable = oracleDb.getTable('operators');


 myTable
         .select (['email','password', 'admin'])
         .where('email like :email')
         .bind('email', p_email)
         .execute(function (row) {
            console.log(row);
            const foundEmail = row[0]
            const password = row[1]
            const admin = row[2]
            const myResults = {
             foundEmail: foundEmail, 
             password: password, 
             admin: admin  }
            console.log(myResults);
            return (myResults, console.log(myResults));
            })    
          .catch(function(err) {
            console.log(err);
            })
            return (myResults)






}) 





res.send('Oracle5 is here');

});


module.exports = router;

这是 nodemon 显示的内容:

test@email.com
POST /oracle5/email/test@email.com 200 14.621 ms - 15
[
  'test@email.com',
  'password',
  1
]
{
  foundEmail: 'test@email',
  password: 'password',
  admin: 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]
  }

这可能是一件非常简单的事情,但我已经尝试了几次迭代,但无法获得正确的组合来将数组作为对象取出。还有一个 .this() 函数,它似乎最适合我正在尝试做的事情,但文档很糟糕,所以如果请提供有关该函数的一些信息,我们将不胜感激。

【问题讨论】:

  • 需要更多说明。你想达到什么目的??
  • 从结果中提取数组的代码在哪里??

标签: mysql node.js mysql-8.0


【解决方案1】:

您正在使用我喜欢称之为基于推送的游标,在调用execute() 时提供回调。

这对于确保数据不在驱动程序/连接器级别缓冲很有用。但是,它使用了一种奇怪的模式,一旦您想在应用程序级别缓冲结果集,它就要求您跟踪多个上下文,即您提供的回调中的上下文(每当结果集的一行变为可用)和then() 处理程序中的一个(在操作完成后调用)并在这些上下文之间共享状态以确保您获得一致的结果。

在这种情况下,例如,您可以声明一个可在两个上下文范围内访问的变量,以保持该共享状态。在处理结果集时会填充该状态,并且可以在操作完成时返回最终状态。

mysqlx.getSession({ user: 'user', password: 'password', host: 'localhost', port: '33060' })
  .then(function (session) {
    const oracleDb = session.getSchema('nms2019local');
    const myTable = oracleDb.getTable('operators');

    // the variable should be accessible within the callback and the `then()` handler
    const myResults = [];

    myTable.select(['email', 'password', 'admin'])
      .where('email like :email')
      .bind('email', p_email)
      .execute(function (row) {
        // populate the state
        myResults.push({ foundEmail: row[0], password: row[1], admin: row[2] });
      })
      .then(() => {
        // return the final state
        return next(myResults);
      })
      .catch(function(err) {
        console.log(err);
      });
  });

我不确定您使用的是哪个版本的连接器,但从 8.0.18 开始,您有了一个替代(并且可能更合理)的接口。您可以删除提供给execute() 的回调,客户端将自动切换到基于拉动的光标模式,可在then() 处理程序中访问。这不需要跟踪任何状态或上下文。

因此,在这种情况下,您现在可以拥有如下内容:

mysqlx.getSession({ user: 'user', password: 'password', host: 'localhost', port: '33060' })
  .then(function (session) {
    const oracleDb = session.getSchema('nms2019local');
    const myTable = oracleDb.getTable('operators');

    myTable.select(['email', 'password', 'admin'])
      .where('email like :email')
      .bind('email', p_email)
      .execute()
      .then(res => {
        const myResults = res.fetchAll()
          .map(function (row) { 
            return { foundEmail: row[0], password: row[1], admin: row[2] };
          });
        return next(myResults);
      })
      .catch(function(err) {
        console.log(err);
      });
  });

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

【讨论】:

  • 感谢您的快速响应,只是为了澄清在这种情况下 fetch.one 与 fetch.all 之间的区别是什么,获取一个只是拉出一个数组元素,或者我是否无关紧要在这种情况下使用 fetch.one vs fetch.all?
  • fetchOne() 从当前结果集中读取一个参数。因此,如果您想读取整个结果集,可以将其用作迭代器,如 while (var doc = res.fetchOne()) { /* do something */ }。由于它只读取一个元素,因此对于文档,它返回一个普通的 JavaScript 对象。 fetchAll() 一次读取整个结果集,因此它返回一个包含一个或多个这些对象的 JavaScript 数组。
  • 很好的跟进,所以我能够返回并发送结果并且它们得到了身份验证,但是无论它是否找到行/电子邮件,它都会发送一个 500 响应代码,我的下一个问题是如果搜索找到电子邮件地址,我如何发送 200 响应代码,或者如果函数未找到电子邮件地址,我如何发送 400 响应?
  • 这有点离题,我不是真正的express 或 REST 服务专家。在您的情况下,您似乎想要类似 404 (Not Found) 的东西。因此,您可以简单地使用if 语句来检查列表是否为空if (myResults.length === 0) { res.status(404).send('some message') } else { res.send(myResults) }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2018-06-30
相关资源
最近更新 更多