node.js - Nodejs、GraphQl 和 SQLServer 返回空值
问题描述
我正在尝试使用我的 SQLServer 数据库连接 Node.js 并表达 Web 服务。
我一直在测试,他们将正确的值返回到数据库,但问题是当我尝试从 Graphql 获取信息并将其转换为 JSON 时
JSON 向我返回了我正确需要的结构,但所有数据都具有空值。
这是数据库配置:
const sql = require('mssql');
const config = {
user: 'user',
password: 'password',
server: 'server',
database: 'db',
options: {
encrypt: true
}
};
这是 Graphql 调用的方法:
let getEmpleado = (id) => {
let datos = sql.connect(config, function(err){
if (err) console.log(err);
let sqlQuery = 'SELECT Empleado, Nombre, Apellido1, Apellido2 FROM dbo.Empleados WHERE Empleado=' + id.id;
let sqlRequest = new sql.Request();
//console.log(sqlQuery);
let datos1 = sqlRequest.query(sqlQuery, function(err, empleado){
let datos2;
if (err) console.log(err)
datos = JSON.stringify(empleado.recordset[0]);
sql.close();
console.log(datos);
//return datos2;
});
//return datos1;
});
return datos;
}
结果:
{
"data": {
"empleado": {
"Empleado": null,
"Nombre": null,
"Apellido1": null,
"Apellido2": null
}
}
}
我对此很陌生,我需要一些帮助,因为我已经疯狂地寻找信息。
编辑1:
调试该函数后,我发现它的执行顺序对我来说不符合逻辑。
我再次输入代码,并用数字表示它执行的步骤。
let getEmpleado = (id) => {
1- let datos = sql.connect(config, function(err){
3- if (err) console.log(err);
4- let sqlQuery = 'SELECT Empleado, Nombre, Apellido1, Apellido2 FROM dbo.Empleados WHERE Empleado=' + id.id;
5- let sqlRequest = new sql.Request();
//console.log(sqlQuery);
6- let datos1 = sqlRequest.query(sqlQuery, function(err, empleado){
8- let datos2;
9- if (err) console.log(err)
10- datos = JSON.stringify(empleado.recordset[0]);
11- sql.close();
12- console.log(datos);
13- //return datos2;
});
7- //return datos1;
});
2- return datos;
}
编辑2:
正如 Daniel 所建议的那样,我检查了 mssql 文档并使用了 promise Queries Example: Promises Queries Example。
调试后,再次执行一些奇怪的功能命令。
1- const sql = require('mssql')
2- sql.on('error', err => {
// ... error handler
})
3- sql.connect(config).then(pool => {
// Query
6- return pool.request()
.input('input_parameter', sql.Int, id.id)
.query('SELECT Empleado, Nombre, Apellido1, Apellido2 FROM dbo.Empleados WHERE Empleado= @input_parameter')
4- }).then(result => {
7- console.dir(result)
8- return result.recordset[0]
}).catch(err => {
// ... error checks
});
5- console.log('End')
解决方案
没有必要使用stringify
. 你的解析器应该返回一个普通的对象,它的属性与返回类型的字段相匹配。换句话说,应该足够 return empleado.recordset[0]
。
每个解析器都会接收其父字段解析为第一个参数的值。如果您不提供客户解析器,则 GraphQL.js 中的默认行为是尝试返回与字段同名的父值的属性。换句话说,该Nombre
字段的默认解析行为是 return parent.Nombre
。如果父字段的解析器返回{ Nombre: 'Fernando' }
,则该Nombre
字段将解析为"Fernando"
。如果父字段的解析器返回一个字符串,Nombre
将解析为,null
因为字符串没有名为 的属性Nombre
。
推荐阅读
- python-3.x - Python3.6 Ldap3 modify_dn(重命名+移动用户到另一个OU)
- hyperledger-fabric - Hyperledger explorer docker连接错误
- debian - 在 debian 8 上使用 apache2 启用 http2
- django - 如何将请求中的json直接存储到mongo数据库中
- ansible - Ansible 不会按照应有的方式解释命令
- angular - 向 FormControl 上的同步验证器添加去抖动?
- excel - Excel:引用其他文件的 IF 语句
- stanford-nlp - 无法使用 regexner.mapping 在 CoreNLPServer 中定义自定义 ner
- docker - Gitlab CI 服务访问
- arrays - 计算SAS中数组中特定范围内的值