Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在express中从MYSQL开发Api中提取数组对象?_Mysql_Node.js_Mysql 8.0 - Fatal编程技术网

如何在express中从MYSQL开发Api中提取数组对象?

如何在express中从MYSQL开发Api中提取数组对象?,mysql,node.js,mysql-8.0,Mysql,Node.js,Mysql 8.0,我正在尝试提取对象/数组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.emai

我正在尝试提取对象/数组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()函数,它似乎最适合我正在尝试做的事情,但是文档非常糟糕,因此如果您也能提供一些关于该函数的信息,我们将不胜感激

您使用的是我喜欢称之为基于推送的游标,在调用
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()
的回调,客户机将自动切换到基于pull的游标模式,可在
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是否只提取一个数组元素,或者在这种情况下使用fetch.one与fetch.all是否无关紧要?
fetchOne()
从当前结果集中读取一个参数。因此,如果要读取整个结果集,可以将其用作迭代器,如
while(var doc=res.fetchOne()){/*do something*/}
。因为它只读取一个元素,所以对于文档,它返回一个普通JavaScript对象
fetchAll()
一次读取整个结果集,因此它返回一个包含一个或多个对象的JavaScript数组。很好的后续操作,因此我能够返回并发送结果,并对结果进行身份验证,但是无论是否找到行/电子邮件,它都会发送500响应代码,我的下一个问题是,如果搜索找到了电子邮件地址,我如何发送200响应码,如果函数没有找到电子邮件地址,我如何发送400响应码?这有点离题,而且我不是真正的
express
或REST服务专家。在您的情况下,似乎您想要的是404(未找到)之类的东西。因此,您只需使用
if
语句检查列表是否为空
if(myResults.length==0){res.status(404.send('some message')}或者{res.send(myResults)}