如何在express中从MYSQL开发Api中提取数组对象?
我正在尝试提取对象/数组myResults,我已经尝试了尽可能多的方法来提取它,但是无法,请有人帮忙吗如何在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
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)}
。