Node.js Nodejs、GraphQl和SQLServer返回空值
我正在尝试将Node.js和expressweb服务与SQLServer数据库连接起来 我一直在测试,它们返回正确的值但问题是当我试图从Graphql获取信息并将其转换为JSON时 JSON返回我正确需要的结构,但包含所有空值数据 这是数据库配置:Node.js Nodejs、GraphQl和SQLServer返回空值,node.js,sql-server,graphql,Node.js,Sql Server,Graphql,我正在尝试将Node.js和expressweb服务与SQLServer数据库连接起来 我一直在测试,它们返回正确的值但问题是当我试图从Graphql获取信息并将其转换为JSON时 JSON返回我正确需要的结构,但包含所有空值数据 这是数据库配置: const sql = require('mssql'); const config = { user: 'user', password: 'password', server: 'server', database: 'db', optio
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 sugested所说,我检查了mssql文档,并使用了promise查询示例:
调试后,再次执行一些奇怪的命令
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
。您的解析器应该返回一个普通对象,其属性与返回类型的字段匹配。换句话说,返回empleado.recordset[0]
就足够了
每个解析器都会将其父字段解析为的值作为第一个参数接收。如果不提供客户解析程序,GraphQL.js中的默认行为是尝试返回与字段同名的父值属性。换句话说,
Nombre
字段的默认解析行为是返回parent.Nombre
。如果父字段的解析器返回{Nombre:'Fernando'}
,则Nombre
字段将解析为“Fernando”
。如果父字段的解析程序返回字符串,Nombre
将解析为null
,因为字符串没有名为Nombre
的属性,因此不需要使用stringify
。您的解析器应该返回一个普通对象,其属性与返回类型的字段匹配。换句话说,返回empleado.recordset[0]
就足够了
每个解析器都会将其父字段解析为的值作为第一个参数接收。如果不提供客户解析程序,GraphQL.js中的默认行为是尝试返回与字段同名的父值属性。换句话说,
Nombre
字段的默认解析行为是返回parent.Nombre
。如果父字段的解析器返回{Nombre:'Fernando'}
,则Nombre
字段将解析为“Fernando”
。如果父字段的解析程序返回字符串,Nombre
将解析为null
,因为字符串没有名为Nombre的属性,并且控制台记录了良好的数据?是的,控制台正确打印数据。当我调试函数时,ir似乎会在连接到数据库之前返回值Use async await?不,正如我所说,我是JavaScript新手,不知道操作系统到底发生了什么。在答案中添加了一些额外的细节。请检查我标记为重复的问题,以获得更广泛的解释。控制台记录良好的数据?是的,控制台正确打印数据。当我调试函数时,ir似乎会在连接到数据库之前返回值Use async await?不,正如我所说,我是JavaScript新手,不知道操作系统到底发生了什么。在答案中添加了一些额外的细节。请检查我标记为重复的问题,以获得更详细的解释。正如您所建议的,我已更改了代码,并只在报税单中输入employee.recordset[0],但我仍然存在相同的问题。我已经添加了有关函数执行顺序的其他信息。@Fernando在使用GraphQL时,还需要避免使用回调。您可以将承诺与mssql
库一起使用——检查它们的文档。另请参见,我已通过添加代码和带有承诺的代码的执行顺序来编辑问题。正如您所建议的,我已更改了代码,并只在return only employee.recordset[0]中输入,但我仍然存在相同的问题。我已经添加了有关函数执行顺序的其他信息。@Fernando在使用GraphQL时,还需要避免使用回调。您可以将承诺与mssql
库一起使用——检查它们的文档。还可以看到,我通过添加代码和带有承诺的代码执行顺序来编辑问题。